แปลงสองเท่าเป็น int


156

วิธีที่ดีที่สุดในการแปลง a doubleเป็นintคืออะไร? ควรใช้ cast หรือไม่


7
กำหนด "ดีที่สุด" ขึ้นอยู่กับว่าคุณต้องการปัดเศษขึ้น / ลง ฯลฯ
RPM1984

8
@ RPM1984: กำหนดetc.:)
Armen Tsirunyan

18
@Armen - touche` :) ไม่เป็นไรจริงๆ - Skeet มาแล้วไม่มีอะไรสำคัญอีกแล้ว
RPM1984

คำตอบ:


237

คุณสามารถใช้เพี้ยนถ้าคุณต้องการพฤติกรรม truncate-to-zero เริ่มต้น หรือคุณอาจต้องการใช้Math.Ceiling, Math.Round, Math.Floorฯลฯ - แม้ว่าคุณยังจะต้องโยนหลังจากนั้น

อย่าลืมว่าช่วงของมีขนาดเล็กกว่าช่วงของint doubleโยนจากdoubleถึงintจะไม่โยนข้อยกเว้นถ้าค่าอยู่นอกช่วงของintในบริบทที่ไม่ถูกตรวจสอบในขณะที่การเรียกร้องให้Convert.ToInt32(double)จะ ผลลัพธ์ของการส่ง (ในบริบทที่ไม่ได้ตรวจสอบ) นั้นไม่ได้กำหนดอย่างชัดเจนหากค่าอยู่นอกช่วง


24
@user: ขนาดของintเป็น 32 บิตเสมอไม่ว่าคุณจะใช้เครื่อง 32 หรือ 64 บิตก็ตาม
Joren

3
และคู่สามารถ huger มากเกินกว่า 64 บิต int
Adrian Ratnapala

7
สำหรับ C # noobs อย่างฉัน: คณิตศาสตร์และการแปลงเป็นส่วนหนึ่งของระบบ ดังนั้นคำตอบที่สมบูรณ์จะเป็นดังนี้:intVal = System.Convert.ToInt32(System.Math.Floor(dblVal));
kris

9
@ user1290746: นั่นจะใช้ได้ แต่โดยปกติคุณจะอยู่using System;ที่ด้านบนสุดของไฟล์ซึ่งอาจเป็นได้intVal = Convert.ToInt32(Math.Floor(dblVal));
Jon Skeet

3
@ user1290746: แต่ในกรณีนั้นฉันไม่คิดว่าทางออกที่ถูกต้องคือการแนะนำให้คนใช้ชื่อที่มีคุณสมบัติครบถ้วน - ทางออกที่ดีกว่าคือการเรียนรู้เกี่ยวกับusingคำสั่ง
Jon Skeet

39

หากคุณใช้งานแคสต์นั่นคือ(int)SomeDoubleคุณจะตัดทอนส่วนที่เป็นเศษส่วน นั่นคือถ้าSomeDoubleเป็น 4.9999 ผลลัพธ์จะเป็น 4 ไม่ใช่ 5 การแปลงเป็น int จะไม่ปัดเศษจำนวนนั้น หากคุณต้องการปัดเศษการใช้งานMath.Round


34

ใช่ทำไมล่ะ

double someDouble = 12323.2;
int someInt = (int)someDouble;

การใช้Convertคลาสใช้งานได้ดีเช่นกัน

int someOtherInt = Convert.ToInt32(someDouble);

7

Convert.ToInt32 เป็นวิธีที่ดีที่สุดในการแปลง


นี่เป็นฟังก์ชั่นที่ไม่ปลอดภัยเพราะยอมรับทุกสิ่ง
Ant_222

4

วิธีที่ดีที่สุดคือใช้ Convert.ToInt32วิธีที่ดีที่สุดก็คือการใช้งานมันเร็วและรอบได้อย่างถูกต้อง

ทำไมจึงซับซ้อนกว่านี้?


2

นี่คือตัวอย่างที่สมบูรณ์

class Example 
{    
  public static void Main() 
  {    
    double x, y; 
    int i; 

    x = 10.0; 
    y = 3.0; 

    // cast double to int, fractional component lost (Line to be replaced) 
    i = (int) (x / y); 
    Console.WriteLine("Integer outcome of x / y: " + i); 
  }    
}

หากคุณต้องการปัดเศษตัวเลขเป็นจำนวนเต็มให้ทำดังนี้

i = (int) Math.Round(x / y); // Line replaced



0

วิธีการของฉันคือ:

 - Convert.ToInt32(double_value)
 - (int)double_value
 - Int32.Parse(double_value.ToString());

11
คุณไม่คิดว่าวิธีที่สามนั้นซับซ้อนและช้าเกินความจำเป็นหรือไม่?
Armen Tsirunyan

6
ที่สามจะไม่ทำงานกับคู่กับชิ้นส่วนเศษส่วน เช่นdouble_value = 0.1
Jeff Mercado

ฉันคิดว่าคุณสามารถใช้ Math.Floor ได้
lindexi

0
label8.Text = "" + years.ToString("00") + " years";

เมื่อคุณต้องการส่งไปที่ป้ายกำกับหรือบางสิ่งและคุณไม่ต้องการส่วนประกอบที่เป็นเศษส่วนนี่เป็นวิธีที่ดีที่สุด

label8.Text = "" + years.ToString("00.00") + " years";

ถ้าคุณต้องการเพียง 2 และมันก็เป็นอย่างนั้นเสมอ

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