ฉันจะแปลง double เป็นค่าจำนวนเต็มที่ใกล้เคียงที่สุดได้อย่างไร


คำตอบ:


78

ใช้Math.round()งานอาจใช้ร่วมกับMidpointRounding.AwayFromZero

เช่น:

Math.Round(1.2) ==> 1
Math.Round(1.5) ==> 2
Math.Round(2.5) ==> 2
Math.Round(2.5, MidpointRounding.AwayFromZero) ==> 3

6
จะไม่Convert.ToInt32()ทำแบบเดียวกันหรือจะตัดทุกอย่างหลังจากจุดทศนิยม?
The Muffin Man

208
ไม่ได้ผลิตจำนวนเต็มจริง แต่เป็นสองเท่า
gatopeich

13
@ Ronnie - ไม่นั่นคือจากการออกแบบ โดยค่าเริ่มต้น Math.Round จะปัดเศษตัวเลขกึ่งกลาง (x + .5) เป็นเลขคู่ที่ใกล้เคียงที่สุด หากคุณต้องการพฤติกรรมที่แตกต่างคุณต้องระบุมันผ่านธง msdn.microsoft.com/en-us/library/system.midpointrounding.aspx
nickf

6
ฉันไม่เคย! :)
Ronnie

5
Double ไม่ใช่ Int
Evgeni Nabokov

267
double d = 1.234;
int i = Convert.ToInt32(d);

การอ้างอิง

จัดการการปัดเศษเช่น:

ปัดเศษเป็นจำนวนเต็มแบบ 32 บิตที่ใกล้ที่สุด หากค่าอยู่ครึ่งทางระหว่างสองจำนวนเต็มจำนวนคู่จะถูกส่งคืน นั่นคือ 4.5 ถูกแปลงเป็น 4 และ 5.5 ถูกแปลงเป็น 6


7
ดีมากว่าMath.Roundมันจะส่งกลับ int ตามที่ต้องการ
Keith

10
@ Robert-koritnik ไม่แน่ใจว่าทำไมจึงเป็น "ไม่ถูกต้อง" OP ไม่ได้ระบุกฎการปัดเศษที่ต้องการและ "round .5 ถึงใกล้ที่สุดแม้" เป็นกฎมาตรฐานจากทางกลับ การปัดเศษขึ้นเสมอมีผลกระทบทางสถิติที่ไม่พึงประสงค์
Keith

@ Keith: ฉันไม่รู้ แต่ฉันถูกสอนให้ปัดเศษx.5ขึ้นไป แต่ฉันเห็นเหตุผลที่จะทำมันขึ้นหรือลงเพื่อดูสถิติ ขอบคุณสำหรับสิ่งนั้น PSมันชัดเจนว่าผมไม่ได้อยู่ในสถิติการเงินหรือบัญชีที่ชนิดของการปัดเศษนี้ดูเหมือนว่าจะเริ่มต้น
Robert Koritnik

3
"การปัดเศษขึ้นเสมอมีผลกระทบทางสถิติที่ไม่พึงประสงค์" - นั่นเป็นเพียงความเท็จธรรมดา การปัดเศษ. 5 ขึ้นไปปัดเศษตัวเลขครึ่งหนึ่งออก - [0,.5)- ลงและครึ่งหนึ่งของตัวเลข - [.5,1)- ขึ้น การปัดเศษเป็นเลขอคติเล็กน้อยแม้ในขณะที่มันปัดเศษ(.5,1.5)เป็น 1 แต่[1.5,2.5]เป็น 2
Jim Balter

11
@JimBalter เนื่องจากศูนย์ไม่ได้ถูกปัดเศษการปัดเศษครึ่งขึ้นไปจะทำให้มีอคติเชิงบวกดังนั้นจึงเป็นที่รู้จักกันในชื่อการปัดเศษแบบอสมมาตร "การปัดเศษครึ่งหนึ่งถึงสองเท่า" นั้นไม่ได้หากการกระจายของคุณมากพอและการปัดเศษนั้นไม่ได้มีอคติไม่ว่าจะเป็นเลขคู่หรือเลขคู่ ดูครึ่งทางปัดเศษผูกทำลาย
sdds

36

คุณยังสามารถใช้ฟังก์ชัน:

//Works with negative numbers now
static int MyRound(double d) {
  if (d < 0) {
    return (int)(d - 0.5);
  }
  return (int)(d + 0.5);
}

ขึ้นอยู่กับสถาปัตยกรรมนั้นเร็วขึ้นหลายเท่า


สิ่งนี้สมบูรณ์แบบสำหรับฉันเนื่องจาก Math.Round ไม่ทำงานตามที่ฉันต้องการ
ฮันนา

@cullub ใช่ มันแปลง double d ซึ่งมี 0.5 ต่อท้ายเป็นจำนวนเต็ม
ดาร์เรล

นี่เป็นวิธีที่ฉันชอบ - ทำงานในวิธีที่ง่ายมาก สั้นกว่ามากและอ่านง่ายกว่า Math.Round (d, MidpointRounding.AwayFromZero) และกระชับกว่าการใช้คำสั่ง if เพื่อเลือกว่าจะปัดเศษหรือปัดเศษขึ้น และในความเป็นจริงกลับจำนวนเต็มที่สิ้นสุดไม่ได้เป็นคู่
binderbound

3
ดูความคิดเห็นของ @ Eternal21 ด้านล่างสำหรับพฤติกรรมแปลก ๆ ในจำนวนลบ (MyRound (-1.2) = 0)
Chris

2
สำหรับใครก็ตามที่สงสัยว่าปัญหาที่ @Chris พูดถึงจะได้รับการแก้ไขโดยการตรวจสอบว่าค่าเป็นลบหรือไม่
John Weisz

14
double d;
int rounded = (int)Math.Round(d);

5

ฉันรู้ว่าคำถามนี้เก่า แต่ฉันเจอในการค้นหาคำตอบของคำถามที่คล้ายกันของฉัน ฉันคิดว่าฉันจะแบ่งปันเคล็ดลับที่มีประโยชน์มากที่ฉันได้รับ

เมื่อแปลงเป็น int เพียงเพิ่ม.5มูลค่าของคุณก่อนที่จะทำการดาวน์สตรีม ในฐานะที่เป็น downcasting จะintเสมอลดลงไปจำนวนที่ต่ำกว่า (เช่น(int)1.7 == 1) ถ้าจำนวนของคุณอยู่.5หรือสูงกว่าการเพิ่ม.5จะนำมันออกเป็นจำนวนถัดไปและเศร้าใจของคุณเพื่อintจะกลับค่าที่ถูกต้อง (เช่น(int)(1.8 + .5) == 2)


13
ปัญหาคือถ้าคุณพยายามแปลงค่าลบด้วยวิธีนั้น ตัวอย่างเช่น -1.25 จะลงท้ายด้วย 0 (-1.25 + 0.5 = 0.75, และเมื่อโยนลงไปที่ int เป็น 0) คุณต้องลบ 0.5 จากค่าลบ
Eternal21

หนึ่งสามารถใช้+ 0.5 * Math.Abs(d)
TaW


-1

เพื่อความสามัคคีใช้Mathf.RoundToInt

using UnityEngine;

public class ExampleScript : MonoBehaviour
{
    void Start()
    {
        // Prints 10
        Debug.Log(Mathf.RoundToInt(10.0f));
        // Prints 10
        Debug.Log(Mathf.RoundToInt(10.2f));
        // Prints 11
        Debug.Log(Mathf.RoundToInt(10.7f));
        // Prints 10
        Debug.Log(Mathf.RoundToInt(10.5f));
        // Prints 12
        Debug.Log(Mathf.RoundToInt(11.5f));

        // Prints -10
        Debug.Log(Mathf.RoundToInt(-10.0f));
        // Prints -10
        Debug.Log(Mathf.RoundToInt(-10.2f));
        // Prints -11
        Debug.Log(Mathf.RoundToInt(-10.7f));
        // Prints -10
        Debug.Log(Mathf.RoundToInt(-10.5f));
        // Prints -12
        Debug.Log(Mathf.RoundToInt(-11.5f));
    }
}

แหล่ง

public static int RoundToInt(float f) { return (int)Math.Round(f); }

Q ไม่ได้พูดถึงหรือแท็ก Unity
XenoRo

@XenoRo ฉันตอบคำถามเก่านี้สำหรับผู้ที่ค้นหาคำตอบที่คล้ายกันเมื่อใช้ Unity
zwcloud

2
คุณสามารถตอบคำถามของคุณเองเพื่อแบ่งปันความรู้ สร้างคำถามแยกเฉพาะสำหรับ API (ในกรณี Unity) ในกรณีเช่นนี้ คำตอบควรเป็นคำถามที่น่าสงสัย มิฉะนั้นอาจมีคำตอบที่นี่สำหรับ C # API ทุกอันที่มีฟังก์ชันการปัดเศษ
XenoRo

-2

ฉันกำลังพัฒนาเครื่องคิดเลขวิทยาศาสตร์ที่ใช้ปุ่ม Int ฉันพบว่าต่อไปนี้เป็นวิธีแก้ปัญหาที่ง่ายและเชื่อถือได้:

double dblInteger;
if( dblNumber < 0 )
   dblInteger = Math.Ceiling(dblNumber);
else
   dblInteger = Math.Floor(dblNumber);

บางครั้ง Math.Round จะสร้างผลลัพธ์ที่ไม่คาดคิดหรือไม่พึงประสงค์และการแปลงเป็นจำนวนเต็มอย่างชัดเจน (ผ่านทาง Cast หรือ Convert.ToInt ... ) มักจะสร้างค่าที่ไม่ถูกต้องสำหรับตัวเลขที่มีความแม่นยำสูงกว่า วิธีการข้างต้นดูเหมือนว่าจะทำงานได้เสมอ


2
ไม่ปัดเศษทั้งหมดเป็นลบและปัดเศษเป็นจำนวนบวกทั้งหมดหรือไม่ ไม่จำเป็นต้องเป็นจำนวนเต็ม "neaerest"
Tim Pohlmann

นี่ไม่ใช่หมายเลขที่ใกล้ที่สุด
Samer Aamar

1
ได้รับ 1.99 ค่านี้จะส่งคืน 1.0
Jon Schneider
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.