当前位置:网站首页>JS - 精度问题
JS - 精度问题
2022-04-22 06:21:00 【推开世界的门】
今天在学习js过程中,发现了一个精度问题 2^53 -1
一探究竟
- 根据国际标准IEEE 754,javascript浮点数的64个二进制位,从最左边开始,是这样组成的
第1位: 符号位,0表示正数,1表示负数 (1位)
第2位到第12位: 储存指数部分 (11位)
第13位到第64位:储存小数部分(即有效数字 52位,除去 符号位和指数位)
符号位决定了一个数的正负,指数部分决定了数值的大小,小数部分决定了数值的精度

IEEE 754规定,有效数字第一位默认总是1,不保存在64位浮点数之中。
也就是说,有效数字总是1.xx...xx的形式,其中xx..xx的部分保存在64位浮点数之中,最长可能为52位
因此,javascript提供的有效数字最长为53个二进制位
精度最长为53个二进制位,意味着绝对值小于2的53次方的整数,即 ±(2^53-1),都可以精确表示
看几个demo
0.1+0.2!=0.3
0.1表示成二进制
0.0001100110011001100110011001100110011001100110011001101
0.2表示成二进制
0.001100110011001100110011001100110011001100110011001101
在计算机里运算加起来,刚好是
0.0100110011001100110011001100110011001100110011001100111
转为十进制就是 0.30000000000000004
解释下为啥其他情况类似于0.9+0.1==1呢?
这是因为虽然加出来的二进制数也不是完全等于1,但多余下来的值1.0000000000000000000000000000000000000000000000000000001
太小了,就被舍去了
解决方法
如果对精度要求不高,直接(0.1+0.2).toFixed(2) == 0.3
利用ES6 Number新属性EPSILON Math.abs(0.1+0.2-0.3)<Number.EPSILON
利用库mathjs,math.format(math.eval(‘0.1 + 0.2’))
版权声明
本文为[推开世界的门]所创,转载请带上原文链接,感谢
https://blog.csdn.net/qq_38845858/article/details/121793437
边栏推荐
- 爬虫学习之2---requests模块--get请求方式
- 案例案例案例
- A thrilling redis vulnerability to the principle of server target changing
- 并发编程的艺术(4):浅谈wait/notify、park/unpark的使用和原理
- 任务段&任务门
- Kotlin 协程Flow、StateFlow、ShareFlow
- 信息系统项目管理师---第四章 项目整体管理
- Redis的设计与实现(5):主从复制策略和优化
- Kotlin collaboration + flow + retrofit to realize network request
- Kotlin collaboration flow, stateflow, shareflow
猜你喜欢
随机推荐
SQL injection (I)
信息系统项目管理师---第四章 项目整体管理
Bom 浏览器对象模型
Mathematical basis of information security
1420 · minimum coverage substring II
BOM browser object model
ES6模块化与Promise
ES6笔记
Kotlin learning 1. Scope functions let, with, run, apply, also
you need to be root to perform this command
Android Room数据库Like模糊查询
JS基础语法
Definition and difference between rewriting and overloading
通过驱动断链来隐藏驱动
Interrupt gate & Trap gate
Deep understanding of MySQL (7): how to tune MySQL
案例案例案例
Kotlin collaboration flow, stateflow, shareflow
VAD virtual memory
深入理解MySQL(7):MySQL如何调优









