JS的浮点数计算不正确问题解决方案

本文探讨了JavaScript中由于二进制表示导致的浮点数运算精度问题,并提供了一个通过转换浮点数为整数进行计算,再调整返回正确浮点数结果的解决方案。此外,文章还指出此问题并非JS独有,C++/C#/Java等语言也有类似问题,但已封装方法避免。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在项目上就有遇到由于js精度问题导致的浮点数的加减乘除结果不正确的问题。如下:

0.1 + 0.2 
=> 0.30000000000000004

6.8 -0.9
=> 5.8999999999999995

7 * 0.8
=> 5.6000000000000005

5.6 / 0.8
=> 6.999999999999999

其实这是因为计算机内部计算,都是使用2进制数,而当js将我们使用的10进制转化为2进制数时,由于其遵循IEEE 754的国际标准,无法精确表示这种包含小数点的数据,因此JS将浮点数转换成了用二进制表示的最接近的近似值,这步操作就是导致误差的原因。

 

解决方案是:定一个函数对计算结果进行转换和处理:通过将浮点数转换成整数进行计算,然后再将整数的小数点位调整,转回正确的浮点数结果。

Math.formatFloat = function (f, digit) {
    var m = Math.pow(10, digit);
    return Math.round(f * m, 10) / m;
}
Math.formatFloat((0.1 + 0.2), 1)
=> 0.3

Math.formatFloat((6.8 -0.9), 1)
=> 5.9

Math.formatFloat((7 * 0.8), 1)
=> 5.6

Math.formatFloat((5.6 / 0.8), 1)
=> 7

 

另外要注明的是:

浮点数运算精度丢失问题并不是js独有的!

只是诸如 C++/C#/Java 这些语言中已经封装好了方法来避免精度的问题

 

参考链接:

1、JavaScript 浮点数精度之谜

2、JS的浮点数计算精度丢失问题解决方案

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值