JavaScript 使用双精度浮点数来处理数字,这就是为什么在处理小数时会遇到精度问题。这种问题是由于在二进制浮点数运算中某些分数无法精确表示的事实导致的,类似于我们无法用有限的十进制小数精确表示 1/3。
为了解决或缓解这个问题,你可以使用以下策略:
-
四舍五入:使用
Number
对象的toFixed()
方法,该方法会四舍五入到你指定的小数位数。但它会返回一个字符串,如果你想要得到一个数字,你需要再次将其转换:var sum = 356.15; var addQty = 0.32; var result = (sum + addQty).toFixed(2); // "356.47" as a string result = Number(result); // Convert back to number if needed
-
整数运算:将问题转换为整数问题,例如,乘以一个因子来处理整数运算,然后再除以相同的因子:
var sum = 356.15; var addQty = 0.32; var factor = 100; // For two decimal places var result = (Math.round(sum * factor) + Math.round(addQty * factor)) / factor; // 356.47
-
使用库:使用如
Big.js
、bignumber.js
或decimal.js
这样的库可以处理大数和精确的小数运算,特别是当你需要进行复杂的数学运算时:// Example using Big.js var Big = require('big.js'); var sum = new Big('356.15'); var addQty = new Big('0.32'); var result = sum.plus(addQty); // '356.47'
-
Intl.NumberFormat:对于涉及格式化数值为位特定语言环境字符串的场景,可以使用
Intl.NumberFormat
对象:var sum = 356.15; var addQty = 0.32; var result = new Intl.NumberFormat('en-US', {minimumFractionDigits: 2, maximumFractionDigits: 2}).format(sum + addQty); // "356.47"
选择正确的解决方案取决于你的具体要求(如精度、性能、易用性)。记住,只有在结果被展示给用户时才应当进行四舍五入;在之前,应尽可能地保持完整的精度。