如何解决如何正确处理Javascript浮点表示错误?
例如:
sum = 0.00;
sum += 46.85 * 0.1;
console.log(sum) // 4.6850000000000005
sum += 179.29 * 0.1;
console.log(sum) // 22.613999999999997
我相信我在简单的加法和简单的乘法中也遇到过这种情况。
我知道这是无法在计算机中正确保持浮点数的结果,这很好。但是,据我所知,Postgres 似乎可以用相同的数字很好地处理这些操作。 Javascript 似乎没有,这似乎很奇怪,除非我遗漏了一些东西。
无论如何,我目前的修复方法是像这样运行它:
const fixFloatError = (n) => {
decimalDigitLength = n.match(/\.(\d+)/)[1].length;
return parseFloat(parseFloat(n).toFixed(decimalDigitLength - 1));
}
let n = String(46.85 * 0.1);
n = fixFloatError(n);
如果您想知道为什么我事先将其转换为字符串,那是因为 Javascript 会在进入函数时自动将 22.6139999999999997 之类的浮点数转换为 22.614(这是正确修复的!无论您是否将该数字硬编码为变量或通过乘法生成它),以及诸如 4.6850000000000005 到 4.6850000000000005 之类的东西(没有改变)。因此,为了获得适用于两种情况的一致函数,我将浮点数作为字符串传递以保持其形式。
我肯定在这里遗漏了一些东西,有更简单的解决方案吗?
解决方法
只需将浮点数乘以 10 的某个因子即可创建更大的整数部分。然后将余数四舍五入并除以相同的因数。
let sum = 46.85 * 0.1;
console.log(sum) // 4.6850000000000005
sum = (Math.round(sum * 1000000000)) / 1000000000;
console.log(sum); // 4.685
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。