js中浮点数运算精度问题

本文探讨了JavaScript中浮点数运算时出现的精度丢失问题,源于Number类型使用IEEE 754标准存储,导致二进制表示无法精确表示某些小数。为解决这一问题,可以采用四舍五入、整数运算或使用专门的库来处理浮点数运算,以提高精度。

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

在js中,我们有时会遇到计算,通过加减乘除处理某些业务。那么这时候如果不做任何处理,就会出现如下典型的精度丢失问题。

console.log(0.1 + 0.2) ; // 0.30000000000000004

下面简要分析下原因:

1、Number 类型

js中数字类型只有Number 类型,Number 类型相当于其他强类型语言中的double类型(双精度浮点型),不区分浮点型和整数型。Number 类型有四种进制表示方法,十进制,二进制,八进制和十六进制,这里只涉及到十进制和二进制。

二进制:0B或者0b (数字0和字母B或者小写字母b) ,后接1或者0表示二进制数

十进制:默认直接输入0-9都是十进制数

Number 类型使用 IEEE 754 格式表示整数和浮点值。

2、IEEE 754

64位二进制数表示一个数字,64位 = 1位符号位 + 11位指数位 + 52位小数位

20202484642967.png

符号位:用来表示数字的正负,-1^符号位数值,0为正数,1为负数

指数位:一般都用科学计数法表示数值大小,但是这里一般都是2进制的科学计数法,表示2的多少次方

小数位:科学计数法前面的数值,IEEE745标准,默认所有的该数值都转为1.xxxxx这种格式,优点是可以省略一位小数位,可以存储更多的数字内容,缺点是丢失精度。大概可以理解为这张图:

1625407940(1).png

3、精度丢失

精度丢失的本质就是浮点数转化为该标准的二进制的过程中出现的丢失

整数转为二进制好理解,这里只介绍小数转二进制,问题出在小数转二进制上。由于也需要转化为指数形式,例如 1/2 = 1 * 2^-1, 1/4 = 1 * 2^-2,所以小数的转化二进制过程是通过判断小数是不是满 1/2,1/4,8/1以此类推,换成数学公式就是乘二取整法

0.1的二进制

0.1*2=0.2======取出整数部分0

0.2*2=0.4======取出整数部分0

0.4*2=0.8======取出整数部分0

0.8*2=1.6======取出整数部分1

0.6*2=1.2======取出整数部分1

0.2*2=0.4======取出整数部分0

0.4*2=0.8======取出整数部分0

0.8*2=1.6======取出整数部分1

0.6*2=1.2======取出整数部分1

接下来会无限循环

0.2*2=0.4======取出整数部分0

0.4*2=0.8======取出整数部分0

0.8*2=1.6======取出整数部分1

0.6*2=1.2======取出整数部分1

所以0.1转化成二进制是:
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值