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

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



답변

동일한 Javadoc에 따르면 :

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

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


답변

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

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

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


답변

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

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);
}


답변

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

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


답변

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

double f = Math.floor(x);

또는

int k = (int) x; 

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


답변

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

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

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


답변