0

可能的重复:
JavaScript 的数学被破坏了吗?

...我能做些什么呢?计算后我想要一个结果的字符串表示。因此,零(加上一)令人不安。“toFixed()”不是一个完美的解决方案,因为我想要所有(正确的)潜在结果的小数,而我之前不知道结果(和小数位数)。所以上面的计算只是一个例子。

4

2 回答 2

2

简短的回答是:计算机以二进制表示数字,因此它们不能将所有以 10 为底的分数完美地表示为 JavaScript 数字。

(稍微)更长的答案是,因为 JavaScript 数字是 64 位浮点数(相当于doubleJava、C# 等中的类型),正如维基百科在此处所描述的那样,有效位的数量是有限的。由于这个原因,这个以 2 为底的数字的精度是有限的。

作为一个类比,考虑以 10 为基数表示 1/3 的分数。假设您只有这么多数字可以使用。这意味着您永远无法以 10 为底精确地表示 1/3,因为 1/3 需要以 10 为底的无限位数来表示。同样,您永远无法以有限的位数完美地表示 1/10,因为 1/10 需要无数位来精确表示。你在这里看到的是一小部分(58/10),计算机无法用有限的位数精确表示,因此计算机正在尽可能接近。

于 2012-08-01T06:43:19.543 回答
0

将无限多个实数压缩为有限位数需要近似表示。尽管整数有无限多,但在大多数程序中,整数计算的结果可以存储在 32 位中。相反,给定任何固定位数,大多数实数计算将产生无法使用那么多位精确表示的量。因此,浮点计算的结果必须经常四舍五入以适应其有限表示。这种舍入误差是浮点计算的特征。

以上来自http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html

于 2012-08-01T06:47:35.000 回答