浮点减法不一致

时间:2014-02-23 01:30:49

标签: floating-point floating-accuracy

在Javascript中:

此表达式(2.0 - 1.1)返回0.8999999999999999。

然而这一个(4.0 - 1.1)返回2.9。

有人可以解释这种不一致吗?

我知道1.1不能用浮点表示。

1 个答案:

答案 0 :(得分:4)

“不一致”与浮点减法无关,而是Javascript显示数字的结果(它也完全一致)。

正如你所说,1.1是不可表示的,所以它的值实际上不是1.1。相反,它具有值:

1.100000000000000088817841970012523233890533447265625

2.0中减去这个值是完全正确的,结果是:

0.899999999999999911182158029987476766109466552734375

此数字不是与0.9最接近的可表示数字(即0.90000000000000002220446049250313080847263336181640625),因此如果打印为0.9,则该值将无法在往返十进制和返回(能够将数字往返十进制表示并返回是一个非常理想的属性)。因此,它以足够的精度打印,以指定正确的值:

0.8999999999999999

在您的第二个示例中,我们从4.0中减去并得到:

2.899999999999999911182158029987476766109466552734375

2.9最接近的可表示的数字(下一个最接近的数字是2.9000000000000003552713678800500929355621337890625),因此它可以打印为2.9但仍然有价值在往返过程中存在。