我开始遇到小数问题,这让我了解了整个浮点数学。我的问题是,什么是可行的解决方案?
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%可行,如同,我不必担心任何相同的问题?而且,你会推荐第一个解决方案还是第二个解决方案?还是另外一个?因为我将在很多计算中使用一种方法。再次感谢您的帮助。
答案 0 :(得分:2)
这不是JavaScript的浮点实现的问题,或者如果使用像toFixed(the MDN docs for it here这样的字符串格式化函数会消失的东西,请说清楚它是返回的字符串表示,而不是其他格式的数)。相反,这是浮点运算作为概念的固有属性 - 它具有可变精度,旨在近似接近某一范围内的值。
如果您希望您的值始终完全准确,唯一的解决方案是不使用浮点数。通常,这是通过使用表示您正在处理的“整数”的一部分的整数来完成的(例如,便士/美分而不是英镑/欧元/美元,或毫秒而不是秒)。或者,您可以找到一个执行定点算术的精确数学库,因此可以避免不准确但性能更差。
如果您不介意缓慢积累的不准确的风险,您可以在输出计算结果时只使用格式化功能显示到某个精度 < / em>的。转换为具有固定精度的字符串然后返回到数字几乎没有意义,因为浮点实现可能仍然无法以完全精确的方式表示该数字。