搭配
非科班前端人的一道送命题:0.1+0.2 等于 0.3 吗? - 知乎 (zhihu.com)
食用更佳
为什么0.1+0.2 不等于 0.3
精度问题
js默认使用的是双精度浮点(ieee754)格式存储数值
在表示整型时,十进制可以和二进制无缝转换,但是浮点型(小数)却不行
回归一下机组课
十进制小数点后一位表示1被分成了十分之几,可以想像成一张大饼,被分成了10份(0.1、0.2、0.3...0.9、1)
二进制小数点后一位表示1被分成了二分之几,可以想像成一张大饼,被分成了2份(0.1、0.2,0.2也就是1)
可以想像一下
那二进制的0.01呢?
二进制逢二进一
0.01就是0.1的一半
想像一下,对折这个二进制的大饼
不难看出,二进制中四分之一个1,应该对应着十进制的0.25
二进制大饼每对折一次,就是除2,小数点往左移一位.
那对应的十进制如何?
二进制 | 十进制 |
0.1 | 0.5 |
0.01 | 0.25 |
0.001 | 0.125 |
0.0001 | 0.0625 |
0.11 | 0.75 |
0.011 | 0.375 |
0.111 | 0.875 |
这是选择的进制决定的
二进制的小数转化为十进制最后一位数永远是5
那么要怎样表示十进制中0.2这样的数字?
看表都知道,二进制浮点数只会对应十进制浮点数中最后一位是5的数,不管怎么用加减去凑最后一位都是5
所以只能接近这个数值,二进制的0.2是个无限的小数,所以才有精度
回到问题
0.1 + 0.2 不等于0.3 的问题也解决了
十进制的0.1和0.2其实都是二进制中无限的小数,他们相加时ieee754标准要求他们不能以无限长的小数去运算,而是要按照规定的精度运算,那必然发生一定的精度丢失,计算的结果就不符合预期了
本文只是稍微的回顾一下机组的知识,被反噬