在JavaScript中添加浮点数

在JavaScript中添加浮点数,javascript,floating-point,binary,Javascript,Floating Point,Binary,我读过,但仍然无法理解为什么有些浮点数可以用二进制表示,为什么有些不能 我知道0.1,0.2,0.3,0.4,0.6,0.7,0.8,0.9将在二进制中给出一个无限分数作为分母,因为10和5都不能用二的幂表示0.5的分母为2^1 当我添加0.2+0.4时,我得到0.6000000000000001,当我添加0.1+0.5时,我得到0.6。我认为这是因为,在第一个和中,我加了两个无限分数,而在第二个和中,我加了0.5,它有一个有限的表示,而0.1,它没有。然而,当我添加0.3+0.4时,我得到了0

我读过,但仍然无法理解为什么有些浮点数可以用二进制表示,为什么有些不能

我知道
0.1
0.2
0.3
0.4
0.6
0.7
0.8
0.9
将在二进制中给出一个无限分数作为分母,因为10和5都不能用二的幂表示<但是,code>0.5的分母为
2^1

当我添加
0.2+0.4
时,我得到
0.6000000000000001
,当我添加
0.1+0.5
时,我得到
0.6
。我认为这是因为,在第一个和中,我加了两个无限分数,而在第二个和中,我加了
0.5
,它有一个有限的表示,而
0.1
,它没有。然而,当我添加
0.3+0.4
时,我得到了
0.7
,这是我没有想到的,因为
0.3
0.4
都没有精确的表示,而且
0.7
也没有

我本以为,由于
0.5
是从
0.1
0.9
(仅在小数点后一位)的唯一一个有限表示形式的小数,因此使用任何其他小数都会给出不精确的表示形式,但事实并非如此


为什么在二进制中添加一些没有有限表示的一点小数会产生精确表示,而有些则不是?

在JavaScript中将数值转换为字符串时,默认值为。这意味着当一个数字显示为“0.6”时,这并不意味着它正好是0.6,只是它比任何其他数字值都更接近0.6,因此仅显示“0.6”就表明它是唯一的数字值,即0.599999999999997779553950749686919152736663818359375

当您将Number对象设置为
0.2
0.4
时,结果实际上是0.2000000000011102230246251565402363166809080908203125和0.40000000002220446049250313080847263336181640625。添加这些值时,结果为0.6000000000000088817841970012523233890533447265625。这与0.599999999999999997779553950749686919152736663818359375不同,并且距离0.6更远,因此JavaScript将其显示为“0.600000000000001”,以表明它与显示为“0.6”的数字不同


当您将数字对象设置为
0.1
0.5
时,结果分别为0.1000000000000005555115123125782702118158340451015625和0.5。当您添加这些值时,结果是0.5999999999977553950749686919152736663818359375,这是JavaScript显示为“0.6”的数字。

有时舍入误差小于精度输出。通常你会得到15位精度,有时错误太小而无法显示。这可能取决于特定的浏览器实现,最终取决于浏览器用来加速代码的编译器吗?