2

我开始遇到小数问题,这让我了解了整个浮点数学。我的问题是,什么是可行的解决方案?

x = 0.1;
y = 0.2;
num = x + y;
num = Math.round(num * 100) / 100;

或者

x = 0.1;
y = 0.2;
num = x + y;
num = num.toFixed(2); 
num = Number(num);

这两个都是 100% 可行的选择吗?比如,再也不用担心遇到同样的问题了?你会推荐哪一个?或者您会推荐不同的解决方案吗?有什么理由使用一种解决方案而不是另一种解决方案?提前感谢您的帮助。

编辑:对不起,我没有更具体。我很好,它始终是 2 位小数,因为这对我的项目来说不是问题。显然,如果你想要更多的小数,你会使用 1000 而不是 100 和 toFixed(3),等等。我主要担心的是,上述两种解决方案是否 100% 可行,例如,我不必担心任何相同的问题?另外,您会推荐第一种解决方案还是第二种解决方案?或者完全是另一个?因为我将大量使用一种方法进行许多计算。再次感谢你的帮助。

4

1 回答 1

2

这不是 JavaScript 的浮点实现的问题,或者如果您使用像 toFixed 这样的字符串格式化函数(这里的 MDN 文档明确指出它是返回的字符串表示,而不是其他格式的数字) . 相反,这是浮点算术作为一个概念的固有属性——它具有可变精度,旨在接近某个范围内的值。

如果您希望您的值始终完全准确,唯一的解决方案是不要使用浮点数。通常,这是通过使用代表您正在处理的“整体”数字的一部分的整数来完成的(例如,便士/美分而不是英镑/欧元/美元,或毫秒而不是秒)。或者,您可以找到一个执行定点算术的精度数学库,这样可以避免不准确,但性能会更差。

如果您不介意慢慢累积不准确的风险,您可以简单地使用格式化函数在输出计算结果时仅显示到一定的精度。转换为具有固定精度的字符串然后再转换为数字几乎没有意义,因为浮点实现可能仍然无法以完整的精度表示该数字。

于 2013-08-02T22:55:19.613 回答