Math.floor가 왜 double을 반환합니까?


103

공식 자바 독은 말한다Math.floor()반환이 double입니다 "계산상의 정수로 동일한"하지만 이유는 반환하지해야 int?

답변:


80

동일한 Javadoc에 따르면 :

인수가 NaN무한대이거나 양수 0 또는 음수 0이면 결과는 인수와 동일합니다. 와 그렇게 할 수 없습니다 int.

가장 큰 double값도 가장 큰 값보다 크므 intlong.


40
int / long을 반환하고 특수한 경우를 다른 방식으로 처리하는 Math.Round 함수와 일치하지 않는 것 같습니다.
zod

1
Javadoc은 " 인수보다 작거나 같고 수학적 정수와 같은 가장 큰 (양의 무한대에 가장 가까운) * 부동 소수점 값 * " 을 리턴한다고 말합니다 . 소수 부분이 잘린 값과 동일하지 않은 값 x> 2 ^ 53 이 주어 집니다. 그것보다 상당히 작을 수 있습니다.
Jim Garrison 2016 년

16

정확성을위한 것입니다. double 데이터 유형에는 53 비트 가수가 있습니다. 무엇보다도 double은 정밀도 손실없이 2 ^ 53까지 전체를 나타낼 수 있습니다.

이렇게 큰 숫자를 정수에 저장하면 오버플로가 발생합니다. 정수에는 32 비트 만 있습니다.

정수를 double로 반환하는 것은 정수가 할 수있는 것보다 훨씬 더 유용한 숫자 범위를 제공하기 때문에 여기서해야 할 올바른 일입니다.


물론 이러한 값에 대처하기 위해 long을 반환 할 수 있습니다. 그래도 복식> 2 ^ 63으로 무엇을해야하는지 알아 내야합니다.
Jon Skeet

1
@Jon, 사실이지만 성능에 영향을 미칩니다 (내가 알고있는 명령 세트에서 long에서 double 로의 변환 명령 없음). 처음에 Math.floor가 복식> 2 ^ 53으로 무엇을하는지 궁금합니다. 일부 결과는 표현할 수 없습니다.
Nils Pipenbrinck

그러나 공식 javadoc에도 나타나는 의사 관용적 형식 (int) Math.floor (foo)는 결과가 int에 맞지 않을 수 있기 때문에 안전하지 않습니다. 그리고 다시 한 번, Math.floor를 사용하기에 안전한 형식은 무엇입니까?
Raibaz

10

다른 사람들이 그 이유를 말해 주었는데,이 작업을하고 싶다면 올바르게 반올림하는 방법을 알려 드리겠습니다. 양수 만 사용하려는 경우 다음 문을 사용할 수 있습니다.

int a=(int) 1.5;

그러나 (int)는 항상 0으로 반올림합니다. 따라서 음수를 사용하려는 경우 :

int a=(int) -1.5; //Equal to -1

제 경우에는 이것을하고 싶지 않았습니다. 다음 코드를 사용하여 반올림을 수행했으며 모든 가장자리 케이스를 잘 처리하는 것 같습니다.

private static long floor(double a)
{
    return (int) Math.floor(a);
}

7
왜 사용하지 (int) Math.floor(a)않습니까? 아마도 더 효율적이고 더 짧습니다.
Solomon Ucko 2017-08-29

@Solomon Ucko 대신 a가 양수이면 (int) Math.floor(a)간단히 쓸 수 있습니다 (int) a.
Leo Leontev

3

가장 큰 int 또는 long보다 두 배 큰 값을 주면 무엇을 반환하고 싶습니까?

(분명히 가장 큰 길이보다 크면 정밀도는 어쨌든 낮을 것입니다-가장 가까운 이론적 정수가 아닐 수도 있지만 그렇더라도 ...)


0

Java에 정수 및 부동 소수점 분할이있는 것처럼 정수 및 부동 소수점 방법이 있습니다.

double f = Math.floor(x);

또는

int k = (int) x; 

그러나 유한 정밀도 산술로 플로어를 사용할 때는 항상주의해야합니다. x를 계산하면 1.99999999와 같은 결과를 얻을 수 있으며, 이는 두 형식 모두에서 2가 아닌 1로 플로어링됩니다. 일부 입력 값에 대해 잘못된 결과를 생성하지 않도록이 제한을 해결해야하는 많은 알고리즘이 있습니다.


0

따라서 오류 및 기타 정수가 아닌 값은 일련의 계산을 통해 올바르게 계단식으로 배열 될 수 있습니다.

예를 들어, Math.floor에 NaN (Not a Number)을 입력하면 함께 전달됩니다.

정수를 반환하면 이러한 상태 또는 오류를 전달할 수 없으며 이전 계산에서 좋지만 추가 처리 후에는 잘못된 결과를 얻을 수 있습니다.

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