SnowKagura‘s blog - 小数
type: channel
link: https://www.snowkagura.com/tag/%E5%B0%8F%E6%95%B0/
items: 关于js中的浮点数使用的IEEE754数值标准

关于js中的浮点数使用的IEEE754数值标准
type: item
date: 2020-10-01T23:11:00+08:00
description: 红宝书上有一个经典的例子，0.1+0.2!=0.3，当第一次看到的时候，百思不得其解，虽然知道浮点数在计算机中是如何存储的，但并不知道为何会出现这种情况首先要知道，数值在计算机中是转化为二进制数字进行保存的，然后就要讲到关于十进制转二进制小数部分的转换方法了。以0.1为例:0.1*2=0.2 取00.2*2=0.4 取00.4*2=0.8 取00.8*2=1.6 取10.6*2=1.2 取10.2*2=0.4 取00.4*2=0.8 取00.8*2=1.6 取1。。。最终得到的二进制数为0.00011001100110011...这样得到的是一个有无穷位数的二进制数字，而保存一个数据不可能用无穷的空间去存储，这就会导致计算机舍去后面的数值，从而我们得到的就是这个数值的近似值了。而js的IEEE754标准也是如此，这导致了js会对一些小数取近似值，0.1和0.2转换成二进制都是无穷数，从而导致了0.1+0.2≠0.3。[scode type="green"]解决该问题的方法：将小数变成整数计算，然后再换回小数，例如0.1+0.2=(0.1*10+0.2*10)/10[/scode]