반올림 오류는 무작위가 아니며 구현 방식은 오류를 최소화하려고 시도합니다. 이는 때때로 오류가 표시되지 않거나 오류가 없음을 의미합니다.
예를 들어 0.1
정확히되지 0.1
즉 new BigDecimal("0.1") < new BigDecimal(0.1)
하지만 0.5
정확히1.0/2
이 프로그램은 실제 가치를 보여줍니다.
BigDecimal _0_1 = new BigDecimal(0.1);
BigDecimal x = _0_1;
for(int i = 1; i <= 10; i ++) {
System.out.println(i+" x 0.1 is "+x+", as double "+x.doubleValue());
x = x.add(_0_1);
}
인쇄물
0.1000000000000000055511151231257827021181583404541015625, as double 0.1
0.2000000000000000111022302462515654042363166809082031250, as double 0.2
0.3000000000000000166533453693773481063544750213623046875, as double 0.30000000000000004
0.4000000000000000222044604925031308084726333618164062500, as double 0.4
0.5000000000000000277555756156289135105907917022705078125, as double 0.5
0.6000000000000000333066907387546962127089500427246093750, as double 0.6000000000000001
0.7000000000000000388578058618804789148271083831787109375, as double 0.7000000000000001
0.8000000000000000444089209850062616169452667236328125000, as double 0.8
0.9000000000000000499600361081320443190634250640869140625, as double 0.9
1.0000000000000000555111512312578270211815834045410156250, as double 1.0
참고 : 그것은 0.3
약간 꺼져 있지만 0.4
비트에 도달하면 53 비트 제한에 맞도록 비트를 아래로 이동해야하며 오류는 무시됩니다. 또, 에러에 대한 크립 위로 0.6
하고 0.7
있지만 위해 0.8
에 1.0
오류가 폐기된다.
5 번 추가하면 오류가 누적되고 취소되지 않습니다.
오류가 발생하는 이유는 정밀도가 제한되어 있기 때문입니다. 즉, 53 비트. 즉, 숫자가 커질수록 더 많은 비트를 사용하므로 비트를 끝까지 버려야합니다. 이 경우 반올림이 발생하여 선호합니다.
더 작은 숫자 (예 : 0.1-0.0999
=>)를 얻을 때 반대 효과를 얻을 수 있으며 1.0000000000000286E-4
이전보다 더 많은 오류가 표시됩니다.
Java 6에서 Math.round (0.49999999999999994)가 1을 반환하는 이유는 이것의 예입니다 .이 경우 계산에서 비트 손실이 답변과 큰 차이를 가져옵니다.