为什么0.1+0.2 !=0.3,怎么解决

简介: JS中数字运算时,有一个叫做 数字运算中的精度缺失的问题,这篇文章,就带着大家了解下JS运算中精度的缺失问题。首先我们先来看一个例子:这里0.1 + 0.2 != 0.3 这个就是我们要解决的问题了。

JS中数字运算时,有一个叫做 数字运算中的精度缺失的问题,这篇文章,就带着大家了解下JS运算中精度的缺失问题。

首先我们先来看一个例子:

img_d2bb1683d09bda99f19abc63898dc741.png

这里0.1 + 0.2 != 0.3 这个就是我们要解决的问题了。

要弄清这个问题的原因,首先我们需要了解下在计算机中数字是如何存储和运算的。在计算机中,数字无论是定点数还是浮点数都是以多位二进制的方式进行存储的。

在JS中数字采用的IEEE 754的双精度标准进行存储,我们可以无需知道他的存储形式,只需要简单的理解成就是存储一个数值所使用的二进制位数比较多而已,这样得到的数会更加精确。

这里为了简单直观,我们使用定点数来说明问题。在定点数中,如果我们以8位二进制来存储数字。

对于整数来说,十进制的35会被存储为: 00100011 其代表 2^5 + 2^1 + 2^0。

对于纯小数来说,十进制的0.375会被存储为: 0.011 其代表 1/2^2 + 1/2^3 = 1/4 + 1/8 = 0.375

而对于像0.1这样的数值用二进制表示你就会发现无法整除,最后算下来会是 0.000110011....由于存储空间有限,最后计算机会舍弃后面的数值,所以我们最后就只能得到一个近似值。

在JS中采用的IEEE 754的双精度标准也是一样的道理,我们且不管这个标准下的存储方式跟定点数存储有何不同,单单在这一点上他们都是相同的,也就是存储空间有限,当出现这种无法整除的小数的时候就会取一个近似值,在js中如果这个近似值足够近似,那么js就会认为他就是那个值。

比较拗口,举个例子:

img_5b37484a7eb140000d129000ef2ed1fb.png

所以我们现在应该可以理解,就是说由于0.1转换成二进制时是shenzhen.offcn.com无限循环的,所以在计算机中0.1只能存储成一个近似值。另外说一句,除了那些能表示成 x/2^n 的数可以被精确表示以外,其余小数都是以近似值得方式存在的。

在0.1 + 0.2这个式子中,0.1和0.2都是近似表示的,在他们相加的时候,两个近似值进行了计算,导致最后得到的值是0.30000000000000004,此时对于JS来说,其不够近似于0.3,于是就出现了0.1 + 0.2 != 0.3 这个现象。 当然,也并非所有的近似值相加都得不到正确的结果。

有时两个近似值进行计算的时候,得到的值是在JS的近似范围内的,于是就可以得到正确答案。至于哪些值计算后能得到正确结果,哪些不能,我们也不需要去记。

最好的方法就是我们想办法规避掉这类小数计算时的精度问题就好了,那么最常用的方法就是将浮点数转化成整数计算。因为整数都是可以精确表示的。

方法也很简单,举个例子:

img_2a400c7c9b37e05558f77fa98128bc83.png
相关文章
|
12天前
|
缓存 数据库
16- 什么是缓存雪崩 ? 怎么解决 ?
# 16 - 缓存雪崩及其解决方案 缓存雪崩是指大量缓存在同一时刻失效,导致数据库承受巨大压力。原因在于键的过期时间设定相同。解决方法是在键的过期时间中加入随机因素,避免同时失效。
16 2
|
5天前
|
数据库 Python
什么问题会导致404?如何解决404?
什么问题会导致404?如何解决404?
|
3月前
|
前端开发 JavaScript
【面试题】如何避免使用过多的 if else?
【面试题】如何避免使用过多的 if else?
|
8月前
I2C误码了怎么处理
I2C误码了怎么处理
|
9月前
|
微服务
什么是服务雪崩,怎么解决这个问题?
什么是服务雪崩,怎么解决这个问题?
108 0
|
9月前
|
缓存
什么是缓存雪崩 ? 怎么解决 ?
什么是缓存雪崩 ? 怎么解决 ?
54 0
|
9月前
|
缓存 监控 容灾
缓存雪崩 ? 怎么解决
缓存雪崩是指当缓存中的大量数据同时失效或者某些原因导致无法使用时,所有的请求都会直接访问数据库,造成数据库压力剧增,甚至导致系统崩溃。下面将详细介绍缓存雪崩的解决方案。
103 0
|
11月前
|
测试技术
R问题|代码报错如何解决?
R问题|代码报错如何解决?
214 0
|
缓存 负载均衡 Oracle
面试官:说下你在项目中是如何处理高并发的???
面试官:说下你在项目中是如何处理高并发的???
300 0
面试官:说下你在项目中是如何处理高并发的???
|
监控 Dubbo Cloud Native
如何解决服务雪崩?
一.什么是服务雪崩 (1)分布式系统环境下,通常会有很多层的服务调用。由于网络原因或自身的原因,服务一般无法保证100%可用。如果一个服务出现了问题,调用这个服务就会出现线程阻塞的情况,此时若有大量的请求涌入,就会出现多条线程阻塞等待,进而导致服务瘫痪。 (2)如下图,对于同步调用,当底层的库存服务不可用时,商品服务请求线程被阻塞,当有大批请求调用库存服务时,最终可能导致整个商品服务资源耗尽,无法继续对外提供服务。 (3)由于服务与服务之间的依赖性,故障会传播,不可用沿请求调用链向上传递,会对整个微服务系统造成灾难性的严重后果,这就是服务故障的“雪崩效应”。
如何解决服务雪崩?