This is a duplicate and I will close it as such as,but here is a example of why why this work for Float
but not for Double
。
而不是看Double
和Float
,让我们看看两种新的类型。 Eighths
和Sixteenths
。 Eighths
有3位表示小数,这样你就可以代表0
,0.125
,0.25
,0.375
,0.5
,0.625
,0.75
和0.875
。 Sixteenths
有4位来表示分数,因此您可以表示0
,0.0625
,0.125
,0.1875
,0.25
等等。在这两种数字类型中,都需要通过选择最接近您想要表示的值来近似浮点值。
让我们来看看1.1 + 0.1
在Eighths
和Sixteenths
之间的样子。
八分
1.1 = 1.125
0.1 = 0.125
1.2 = 1.25
1.1 + 0.1 = 1.125 + 0.125 = 1.25
所以1.1 + 0.1 == 1.2
在Eighths
十六分之
1.1 = 1.125
0.1 = 0.125
1.2 = 1.1875
1.1 + 0.1 = 1.125 + 0.125 = 1.25
所以1.1 + 0.1 != 1.2
在Sixteenths
。
的Sixteenths
的更高的精度使得有可能以较小的值时在Sixteenths
表示更精确地表示1.2
。
这就是Float
s和Double
s发生的情况。有更多的位可用于表示数字,但它们仍然是近似值。当用这些近似值进行数学运算时,误差会以意想不到的方式结合起来,这就是为什么建议使用与浮点值进行等值比较的原因。
@Leo Dabus你建议的那个不回答我的问题。我知道它讨论的是浮点数的精度,但没有讨论的部分提到为什么float返回true而double不是。所以请再考虑并从我的问题中删除重复。 – THCoder
浮点数为单精度,双精度为双精度。 –
@Leo Dabus我认为这是一个有效的问题,我对“Float”和“Double”之间的差异感到好奇。如果有什么,它应该是相反的... –