js中小数计算时精度问题

JavaScript中的Number类型使用双精度浮点型表示,导致小数计算时存在精度问题,主要体现在小数转二进制的乘二取整过程中。这种精度丢失在0.1+0.2不等于0.3的例子中尤为明显。解决办法包括使用Number.toFixed()限定小数位数,或者借助如bignumber.js等第三方库进行高精度计算。

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

js中的number为双精度浮点型,计算时需要先进行进制转换,将十进制换成二进制,而进制转换时,小数就有可能出现精度问题了,原因如下

整数转二进制:除二取余法(没有问题)
4 除以 2 取余数直到商为0
4/2 = 2……0
2/2 = 1……0
1/2 = 0……1
反向取余数得到
4 ----》100 = 1 * 2 ^ 2 + 0 * 2 ^ 1 + 0 * 2 ^ 0

小数转二进制:乘二取整法(精度丢失)
0.1 乘 2 取整数直到积为整数
0.1 * 2 = 0.2
0.2 * 2 = 0.4
0.4 * 2 = 0.8
0.8 * 2 = 1.6
0.6 * 2 = 1.2
0.2 * 2 = 0.4
然后一直重复……
所以取整数部分得到
0.1 ----》0.000110……(无限循环)
双精度浮点型是用64位二进制存储的,意味着这里会有0舍1入的精度丢失,这就能解释为什么0.1+0.2 !=0.3了

解决方案:

  1. 使用Number.toFixed()将小数的位数进行限制,减小精度误差的出现
    toFixed
  2. 封装一个方法用于计算,先将number转化为整数
function calulate(firstNumber, sec
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值