关于java double类型运算的困惑
高洛峰
高洛峰 2017-04-17 17:41:32
0
2
342

请看下面的代码

double a = 0.001;
double b = 13.456;
System.out.println(a);
System.out.println(b);
System.out.println(a+b);
System.out.println(b-a);

运算的结果是

0.001
13.456
13.456999999999999
13.455;

表示对结果不太理解,难道ab相加的结果不应该是13.457么

高洛峰
高洛峰

拥有18年软件开发和IT教学经验。曾任多家上市公司技术总监、架构师、项目经理、高级软件工程师等职务。 网络人气名人讲师,...

모든 응답(2)
迷茫

Double은 연산 중에 정밀도를 잃게 됩니다. 연산에는 java.math.BigDecimal을 사용하는 것이 좋습니다.

小葫芦

이는 컴퓨터의 부동 소수점 숫자가 정확하지 않을 수 있기 때문입니다(가능함). 정확한 값에 무한히 근접할 수는 있지만 완전히 정확할 수는 없습니다. 왜 그럴까요? 이는 부동 소수점 숫자의 저장 규칙에 따라 결정됩니다. 먼저 "2를 곱하고 반올림하여 순서대로 정렬"하는 방법을 사용하여 십진수 0.4를 이진수로 변환하는 방법을 살펴보겠습니다. 이는 너무 당연한 일입니다. ) 0.4는 이진수로 정확하게 표현될 수 없다는 것을 발견했습니다. 즉, 무한히 반복되는 십진수입니다. 단독으로 메모리에 저장됨(부동 소수점 수) 저장소에는 부호 비트, 지수 비트, 가수의 세 부분이 포함됩니다(자세한 내용은 소개되지 않음). 십진수 세계에서는 1/3을 정확하게 표현할 수 있는 방법이 없다는 것을 이해할 수 있습니다. 물론 이진 세계에서는 1/5을 정확하게 표현할 방법이 없습니다. (이진에도 분수가 있으면 표현할 수 있습니다.) 이진 세계에서 1/5은 무한히 반복되는 소수입니다.

최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿