我已阅读this Stack Overflow thread和this blog post,但我仍然无法理解为什么某些浮点数可以完全用二进制表示,以及为什么有些浮点数不能。<\ n / p>
我理解0.1
,0.2
,0.3
,0.4
,0.6
,0.7
,0.8
,{{将二元系统中的无限分数作为它们的分母,因为10和5都不能用2的幂表示。 0.9
的分母为0.5
。
当我添加2^1
时,我得到0.2 + 0.4
,当我添加0.6000000000000001
时,我得到0.1 + 0.5
。我认为这是因为,在第一个总和中,我添加了两个无限分数,而在第二个总和中,我添加0.6
,其具有有限的表示,0.5
,其中没有#39;吨。但是,当我添加0.1
时,我得到了0.3 + 0.4
,这是我没有预料到的,因为0.7
和0.3
都没有确切的表示,也没有0.4
。
我原以为,0.7
是从0.5
到0.1
(只有一个小数位)的唯一小数,表示有限,使用任何其他小数就会得到一个不准确的表示,但事实并非如此。
为什么在二进制中添加一些没有有限表示的一点小数会产生精确的表示而一些不是?
答案 0 :(得分:1)
在JavaScript中将Number值转换为字符串时,默认值为to use just enough digits to uniquely distinguish the Number
value。这意味着当一个数字显示为“0.6”时,这并不意味着它正好是0.6,只是它比任何其他数值更接近0.6,所以只显示“0.6”表示它是这个唯一的数值,这是0.59999999999999997779553950749686919152736663818359375。
将Number对象设置为0.2
和0.4
时,结果实际为0.200000000000000011102230246251565404236316680908203125和0.40000000000000002220446049250313080847263336181640625。添加这些时,结果为0.600000000000000088817841970012523233890533447265625。这与0.599999999999999777779553950749686919152736663818359375不同,它距离0.6更远,因此JavaScript将其显示为“0.6000000000000001”,以表明它与显示为“0.6”的数字不同。
将Number对象设置为0.1
和0.5
时,结果为0.1000000000000000055511151231257827021181583404541015625和0.5。添加这些时,结果为0.59999999999999997779553950749686919152736663818359375,这是JavaScript显示为“0.6”的数字。