我有以下虚拟测试脚本:
function test() { var x = 0.1 * 0.2; document.write(x); } test();
这将打印结果0.020000000000000004,而它应该只打印0.02(如果您使用计算器)。据我了解,这是由于浮点乘法精度的错误。
0.020000000000000004
0.02
有没有人有一个好的解决方案,以便在这种情况下我得到正确的结果0.02?我知道有类似toFixed或四舍五入的功能是另一种可能性,但我希望真正打印整数而不进行任何切割和四舍五入。只是想知道你们中的一个人是否有一些不错的、优雅的解决方案。
toFixed
当然,否则我会四舍五入到 10 位数左右。
从浮点指南:
我能做些什么来避免这个问题? 这取决于你在做什么样的计算。 如果您确实需要将结果精确地相加,尤其是在使用金钱时:使用特殊的十进制数据类型。 如果您只是不想看到所有这些额外的小数位:只需在显示结果时将结果格式化为固定的小数位数。 如果您没有可用的十进制数据类型,另一种方法是使用整数,例如完全以美分计算货币。但这是更多的工作并且有一些缺点。
我能做些什么来避免这个问题?
这取决于你在做什么样的计算。
请注意,仅当您确实需要特定的精确 小数 行为时才适用第一点。大多数人不需要这个,他们只是对他们的程序不能正确处理像 1/10 这样的数字感到恼火,却没有意识到如果发生 1/3,他们甚至不会因同样的错误而眨眼。
如果第一点真的适用于您,请为 JavaScript 使用 BigDecimal,它一点也不优雅,但实际上解决了问题,而不是提供了一个不完美的解决方法。