84669 person learning
152542 person learning
20005 person learning
5487 person learning
7821 person learning
359900 person learning
3350 person learning
180660 person learning
48569 person learning
18603 person learning
40936 person learning
1549 person learning
1183 person learning
32909 person learning
0.1+0.2 --> 0.30000000000000004有大神能通俗易懂的解释下这是为啥么。。。书上写的好高大上,实在是看不懂
欢迎选择我的课程,让我们一起见证您的进步~~
二进制表示小数有限制。比如:0.1(十进制) = 0.0001100110011001(16位二进制)0.1=1/2*0+1/2^2*0+1/2^3*0+1/2^4*1+1/2^5*1+1/2^6*0+1/2^7*0+1/2^8*1......你把红色的连起来就是0.1的二进制部分,但是在有限长度下加起来怎么也不是0.1。
0
1
再举个不太恰当的例子。把分数当作十进制小数来看,把小数当作二进制数来看,并且假设只能有10位长度。1/3只能用小数0.3333333333(假设只能有10位)来表示接近1/3;1/3+1/3是2/3,但是用小数表示就是0.3333333333+0.3333333333=0.6666666666;再转化为分数是19999999998/30000000000而2/3则是20000000000/30000000000误差就出来了。
十进制小数
二进制数
10
0~1 之间的小数有无穷多个,但是如果用8个bit表示一个小数,只能表示256个不同的浮点数。
如果用 0000 0000 表示 0 0000 0001 表示 1/255 。。。 1111 1111 表示 1。那如果我需要保存 1/256该怎么办呢?就只能把其近似为 1/255 保存为 0000 0001.所以 1/256+1/256 (0000 0001 + 0000 0001 = 0000 0010) 变成了1/256+1/256=2/255。
0000 0000
0000 0001
1111 1111
1/256
1/256+1/256
0000 0001 + 0000 0001 = 0000 0010
1/256+1/256=2/255
在现实中,其实使用 64bit表示 约-10e-308 ~ 10 e308 范围内的所有浮点数。可是这之间的浮点书有无穷多个。64bit只能分成有限中情况。于是有些输入的浮点数在计算机内保存的只是其近似值。于是。。。。
可以参考我以前写的文章 http://www.cnblogs.com/zichi/...
简单点说就是 0.1 和 0.2 相加在计算机内都需要转为二进制,但是转为二进制后这两个数都是无限长的,于是相加就有精度损失了
你可以简单理解为浮点数计算的时候精度会丢失。至于为什么。
可参考https://www.zhihu.com/questio...
各种计数方式都会存在精度的问题你可以类比下面这种:分数:1/3 + 1/3 +1/3 = 1将1/3换成小数时0.33333...(循环)那么0.33333...(循环) + 0.33333...(循环) + 0.33333...(循环) = 0.99999...(循环)或许会对你理解有些帮助
二进制表示小数有限制。
比如:0.1(十进制) = 0.0001100110011001(16位二进制)
0.1=1/2*
0
+1/2^2*0
+1/2^3*0
+1/2^4*1
+1/2^5*1
+1/2^6*0
+1/2^7*0
+1/2^8*1
......你把红色的连起来就是0.1的二进制部分,但是在有限长度下加起来怎么也不是0.1。
再举个不太恰当的例子。
把分数当作
十进制小数
来看,把小数当作二进制数
来看,并且假设只能有10
位长度。1/3只能用小数0.3333333333(假设只能有10位)来表示接近1/3;
1/3+1/3是2/3,但是用小数表示就是0.3333333333+0.3333333333=0.6666666666;再转化为分数是19999999998/30000000000
而2/3则是20000000000/30000000000
误差就出来了。
0~1 之间的小数有无穷多个,但是如果用8个bit表示一个小数,只能表示256个不同的浮点数。
如果用
0000 0000
表示 00000 0001
表示 1/255 。。。1111 1111
表示 1。那如果我需要保存
1/256
该怎么办呢?就只能把其近似为 1/255 保存为0000 0001
.所以1/256+1/256
(0000 0001 + 0000 0001 = 0000 0010
) 变成了1/256+1/256=2/255
。在现实中,其实使用 64bit表示 约-10e-308 ~ 10 e308 范围内的所有浮点数。可是这之间的浮点书有无穷多个。
64bit只能分成有限中情况。于是有些输入的浮点数在计算机内保存的只是其近似值。于是。。。。
可以参考我以前写的文章 http://www.cnblogs.com/zichi/...
简单点说就是 0.1 和 0.2 相加在计算机内都需要转为二进制,但是转为二进制后这两个数都是无限长的,于是相加就有精度损失了
你可以简单理解为浮点数计算的时候精度会丢失。至于为什么。
可参考https://www.zhihu.com/questio...
各种计数方式都会存在精度的问题你可以类比下面这种:
分数:
1/3 + 1/3 +1/3 = 1
将1/3换成小数时0.33333...(循环)
那么
0.33333...(循环) + 0.33333...(循环) + 0.33333...(循环) = 0.99999...(循环)
或许会对你理解有些帮助