Java에서 double을 정수로 변환


114

Java에서는 double을 정수로 변환하고 싶습니다.

double x = 1.5;
int y = (int)x;

y = 1을 얻습니다. 이렇게하면 :

int y = (int)Math.round(x);

당신은 2를 얻게 될 것입니다. 그러나 저는 궁금합니다. 정수의 이중 표현이 때때로 1.9999999998 같은 것처럼 보이기 때문에 Math.round ()를 통해 생성 된 double을 캐스팅하면 여전히 잘린 숫자가 될 가능성이 있습니까? 우리가 찾고있는 반올림 된 숫자보다 (즉 : 표시된 코드에서 2 대신 1)?

(예, 그렇습니다. x에 대한 값 이 있습니까? 여기서 y는 x의 반올림 대신 잘린 결과를 표시합니까?)

그렇다면 : 잘림 위험없이 double을 둥근 int로 만드는 더 좋은 방법이 있습니까?


뭔가 생각했습니다 : Math.round (x)는 double이 아닌 long을 반환합니다. 따라서 Math.round ()가 3.9999998과 같은 숫자를 반환하는 것은 불가능합니다. 따라서 int (Math.round ())는 아무것도자를 필요가 없으며 항상 작동합니다.


6
Math.round (double)은 double이 아닌 long을 반환합니다.
qbert220

답변:


95

더블 생성 비아를 캐스팅 Math.round()하면 여전히 숫자가 잘릴 가능성이 있습니까?

아니요, round()항상 double을 올바른 값으로 반올림 한 다음 long소수점 이하 자릿수를 자르는 로 캐스트됩니다 . 그러나 반올림 후에는 분수 부분이 남아 있지 않습니다.

다음은 문서입니다 Math.round(double).

인수에 가장 가까운 long을 반환합니다. 결과는 1/2을 더하고 결과의 바닥을 취한 후 결과를 long 유형으로 캐스트하여 정수로 반올림됩니다. 즉, 결과는 표현식의 값과 같습니다.

(long)Math.floor(a + 0.5d)

3
중요한 점은 반올림이 round 방법 내에서 수행된다는 것입니다. int로 안전하게 캐스트 할 수있는 long 값이 반환됩니다 (반환 된 값이 항상 int 범위 내에 있다고 가정).
qbert220

예. / long / int가 문제를 일으키는 것을 상상할 수 없습니다. 명백하게! 이 :( 냈어요해야
vdMandele

1
반올림으로 인해 잘림이 발생하지 않는 것은 사실이지만, 매우 큰 수인 double에서 [max double: 1.7976931348623157E308]훨씬 작은 int로 캐스트하기 때문에 단순히 예상 결과를 얻지 못할 수 있습니다 [max int: 2147483647]. 명심해야 할 사항입니다.
Nelda.techspiress

22

데이터 유형의 경우 Doubleint, 다음을 사용할 수 있습니다 :

Double double = 5.00;

int integer = double.intValue();

그는 반올림 된 값을 찾고 있습니다.
론의 후작

1
4.99999999999 (5가 아닌 4를 줄 것임)에 대한 기대치를 줄 것이라고 생각하지 않습니다
murkle

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.