JavaScript数字精度丢失问题总结

本文探讨了JavaScript中数字精度丢失的常见问题,包括浮点数相加、大整数运算和toFixed方法的不足。深入分析了精度丢失源于计算机二进制存储的限制和JS遵循的IEEE 754规范。提出了将小数放大为整数计算后再还原的解决方案,并提供了一段修复toFixed精度问题的代码示例。
摘要由CSDN通过智能技术生成

本文分为三个部分:

1、JS 数字精度丢失的一些典型问题(前端遇小数计算概率大,要有这个精度丢失的意识

2、JS 数字精度丢失的原因(计算机用二进制存储数据,由于存储位置的限制有时会存在“舍去”。当模仿十进制进行四舍五入时,0舍1入,造成误差

3、解决方案(一个对象+一个函数)(解决方案:把小数乘以倍数变成整数计算,再除以倍数变成原来的数。其中根据此思想封装了一个方法

一、JS数字精度丢失的一些典型问题

1. 两个简单的浮点数相加(前端上这种现象比较多,需要注意)

0.1 + 0.2 != 0.3 // true

  看看Java的运算结果

2. 大整数运算

9999999999999999 == 10000000000000001 // true

var x = 9007199254740992
x + 1 == x // true

  16位和17位数竟然相等;加1竟然也相等。

3. toFixed 不会四舍五入(Chrome)

1.335.toFixed(2) // 1.33

  线上曾经发生过 Chrome 中价格和其它浏览器不一致,正是因为 toFixed 兼容性问题导致。

二、JS 数字丢失精度的原因

  计算机的二进制实现和位数限制有些数无法有限表示。就像一些无理数不能有限表示,如 圆周率 3.1415926...,1.3333... 等。JS 遵循 IEEE 754 规范,采用双精度存储(double precision),占用 64 bit。如图

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值