또는를 사용하는 경우 반올림 을 사용 double
하거나 float
반올림 오류가 발생할 것으로 예상해야합니다. 이 작업을 수행 할 수없는 경우 BigDecimal
.
문제는 0.1이 정확한 표현이 아니며 계산을 두 번 수행하면 해당 오류를 복합화한다는 것입니다.
그러나 100은 정확하게 표현할 수 있으므로 다음을 시도하십시오.
double x = 1234;
x /= 100;
System.out.println(x);
인쇄 :
12.34
이것은 Double.toString(d)
사용자를 대신하여 소량의 반올림을 수행 하기 때문에 작동 하지만 많지는 않습니다. 반올림하지 않고 어떻게 생겼는지 궁금한 경우 :
System.out.println(new BigDecimal(0.1));
System.out.println(new BigDecimal(x));
인쇄물:
0.100000000000000005551115123125782702118158340454101562
12.339999999999999857891452847979962825775146484375
요컨대, 명시 적으로 수행하든 그렇지 않든 부동 소수점의 현명한 답변에 대해 반올림은 피할 수 없습니다.
참고 : x / 100
그리고 x * 0.01
그것은 오류를 반올림에 관해서 정확하게 동일하지 않습니다. 이는 첫 번째 표현식의 반올림 오차가 x 값에 의존하는 반면 0.01
두 번째 표현식의 반올림 오차는 고정되어 있기 때문 입니다.
for(int i=0;i<200;i++) {
double d1 = (double) i / 100;
double d2 = i * 0.01;
if (d1 != d2)
System.out.println(d1 + " != "+d2);
}
인쇄물
0.35 != 0.35000000000000003
0.41 != 0.41000000000000003
0.47 != 0.47000000000000003
0.57 != 0.5700000000000001
0.69 != 0.6900000000000001
0.7 != 0.7000000000000001
0.82 != 0.8200000000000001
0.83 != 0.8300000000000001
0.94 != 0.9400000000000001
0.95 != 0.9500000000000001
1.13 != 1.1300000000000001
1.14 != 1.1400000000000001
1.15 != 1.1500000000000001
1.38 != 1.3800000000000001
1.39 != 1.3900000000000001
1.4 != 1.4000000000000001
1.63 != 1.6300000000000001
1.64 != 1.6400000000000001
1.65 != 1.6500000000000001
1.66 != 1.6600000000000001
1.88 != 1.8800000000000001
1.89 != 1.8900000000000001
1.9 != 1.9000000000000001
1.91 != 1.9100000000000001