double을 int로 변환


156

을 변환하는 가장 좋은 방법은 무엇입니까 double로는 int? 캐스트를 사용해야합니까?


7
"최고"를 정의하십시오. 위 / 아래 반올림 등을 원하는지 여부에 따라 다름
RPM1984

8
@ RPM1984 : Define etc.:)
Armen Tsirunyan

18
@Armen-touche` :) 어쨌든 중요하지 않습니다-Skeet이 여기에 있습니다. 다른 것은 중요하지 않습니다.
RPM1984

답변:


237

기본 자르기를 0으로 설정하려는 경우 캐스트를 사용할 수 있습니다. 또한, 사용할 수있는 Math.Ceiling, Math.Round, Math.Floor등 - 당신은 아직도 이후에 깁스를해야하지만.

의 범위 int가의 범위보다 훨씬 작다는 것을 잊지 마십시오 double. 발 캐스트 double에이 int값의 범위를 벗어난 경우에 예외가 발생하지 않을 것이다 int체크되지 않은 상황에서 호출 반면 Convert.ToInt32(double)된다. 값이 범위를 벗어나면 캐스트 결과 (확인되지 ​​않은 컨텍스트)가 명시 적으로 정의되지 않습니다.


24
@user : int32 비트 또는 64 비트 시스템을 사용하는지 여부에 관계없이 크기 는 항상 32 비트입니다.
Joren

3
그리고 double은 64 비트 int보다 훨씬 클 수 있습니다.
Adrian Ratnapala

7
나와 같은 C # 멍청한 놈의 경우 : Math와 Convert는 모두 System의 일부입니다. 완전한 답은 다음과 같습니다 :intVal = System.Convert.ToInt32(System.Math.Floor(dblVal));
kris may

9
@ user1290746 : 그것은 작동합니다,하지만 당신은 대개 거라고 using System;하는 단지가 될 수 가리 파일의 상단에intVal = Convert.ToInt32(Math.Floor(dblVal));
존 소총

3
@ user1290746 : 그러나이 경우 올바른 해결책은 사람들에게 정규화 된 이름을 사용하도록 조언하는 것이라고 생각하지 않습니다. 더 나은 해결책은 using지시문 에 대해 배우는 것 입니다.
Jon Skeet

39

캐스트를 사용하는 경우 즉 (int)SomeDouble, 분수 부분이 잘립니다. 즉, SomeDouble4.9999 인 경우 결과는 5가 아니라 4가됩니다. 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.