发布于 2024 年 2 月 26 日,星期一
JavaScript中浮点数运算的常见问题。0.1和0.2在二进制表示中是无限循环小数,计算机存储时会截断,导致精度丢失,因此0.1+0.2并不精确等于0.3。解决方法包括使用整数运算、第三方库如Big.js或bignumber.js,或设置误差范围判断相等。本质是二进制浮点数表示法无法精确表示某些十进制小数,需通过特定手段处理精度问题。
欢迎关注 『非同质前端札记』https://mp.weixin.qq.com/s?__biz=MzkyOTI2MzE0MQ==&mid=2247485576&idx=1&sn=5ddfe93f427f05f5d126dead859d0dc8&chksm=c20d73c2f57afad4bbea380dfa1bcc15367a4cc06bf5dd0603100e8bd7bb317009fa65442cdb&token=1071012447&lang=zh_CN#rd 公众号 ,一起探索学习前端技术......
前端小菜鸡一枚,分享的文章纯属个人见解,若有不正确或可待讨论点可随意评论,与各位同学一起学习~
let n1 = 0.1,
n2 = 0.2;
console.log(n1 + n2 === 0.3); // false -> 0.1 + 0.2 = 0.30000000000000004
(n1 + n2).toFixed(2); // 注意,toFixed为四舍五入
toFixed(num)
:方法可把 Number 四舍五入为指定小数位数的数字。
0.0001100110011001100...
(1100 循环),0.2 的二进制是:0.00110011001100...
(1100 循环),这两个数的二进制都是无限循环的数。Number
,它的实现遵循 IEEE 754
标准,使用 64 位固定长度来表示,也就是标准的 double 双精度浮点数
。在二进制科学表示法中,双精度浮点数的小数部分最多只能保留 52
位,再加上前面的 1
,其实就是保留 53
位有效数字,剩余的需要舍去,遵从“0 舍 1 入
”的原则。0.30000000000000004
。0.00011001100110011001100110011001100110011001100110011001 10011...
(1.1001100110011001100110011001100110011001100110011001 * 2) ^ -4;
1001100110011001100110011001100110011001100110011001;
-1022~1013
。1111111011
.0 1111111011 1001100110011001100110011001100110011001100110011001
Number.EPSILON
属性,而它的值就是 2-52,只要判断0.1+0.2-0.3
是否小于Number.EPSILON
,如果小于,就可以判断为 0.1 + 0.2 === 0.3。function numberepsilon(arg1, arg2) {
return Math.abs(arg1 - arg2) < Number.EPSILON;
}
console.log(numberepsilon(0.1 + 0.2, 0.3)); // true
Q:(question)
R:(result)
A:(attention matters)
D:(detail info)
S:(summary)
Ana:(analysis)
T:(tips)