Java 浮点算术和双精度?
我被Java 浮点算术和双精度?,java,floating-point,language-agnostic,Java,Floating Point,Language Agnostic,我被float和double之间的差异弄糊涂了。我读书。我想差别只是在精确度上。因此,我预计如果0.1+0.2==0.3返回false,那么0.1f+0.2f==0.3f 但是实际上0.1f+0.2f==0.3f返回true。为什么 这是纯Java问题还是什么?你不应该比较浮点或双精度是否相等,你不能真正保证分配给浮点或双精度的数字是精确的不,这只是十进制-二进制转换的产物 在引擎盖下,浮点数用二进制表示。数字0.1不能用二进制精确表示,因此需要四舍五入到最接近的可表示数字,其中浮点数为: 0.
float
和double
之间的差异弄糊涂了。我读书。我想差别只是在精确度上。因此,我预计如果0.1+0.2==0.3
返回false
,那么0.1f+0.2f==0.3f
但是实际上0.1f+0.2f==0.3f
返回true
。为什么
这是纯Java问题还是什么?你不应该比较浮点或双精度是否相等,你不能真正保证分配给浮点或双精度的数字是精确的不,这只是十进制-二进制转换的产物 在引擎盖下,浮点数用二进制表示。数字0.1不能用二进制精确表示,因此需要四舍五入到最接近的可表示数字,其中
浮点数为:
0.100000001490119119384765625
而double
是:
0.10000000000000055115123125782702118158340454015625
因此,如果将最接近0.1的double
和最接近0.2的double
相加,然后将结果四舍五入到最接近的double
,实际上不会得到最接近0.3的double
,而是得到它后面的一个(通常打印为0.300000000000000004
,但实际上有更多的数字),因此缺乏平等性
另一方面,如果你加上最接近0.1的float
和最接近0.2的float
,然后将结果四舍五入到最接近的float
,你会得到最接近0.3的float
这句话太强了。在很多情况下,比较float是完全合理的s或双倍表示相等。