0.1 + 0.2 为什么得出来的是 一个大于 0.3 的数,而不是 一个小于 0.3 的数?

2018 年 4 月 21 日
 silver107

0.1 + 0.2 为什么得出来的是 一个大于 0.3 的数,而不是 一个小于 0.3 的数?

( 0.1 + 0.2 = 0.30000000000000004 )

4483 次点击
所在节点    问与答
18 条回复
AngelCriss
2018 年 4 月 21 日
0.1 + 0.2 不等于 0.3 ?难道我小学数学老师原本是教体育的?
KenroHoro
2018 年 4 月 21 日
IEEE754
wdd2007
2018 年 4 月 21 日
浮点数比较无意义
jingous
2018 年 4 月 21 日
把两个小数转化为二进制加一下看看
silver107
2018 年 4 月 21 日
@wdd2007 只是想知道精度丢失为什么反而会变大
flowfire
2018 年 4 月 21 日
。。。。四舍和五入都属于精度丢失
lance6716
2018 年 4 月 21 日
IEEE754
Shura
2018 年 4 月 21 日
@silver107 因为舍入处理的时候,可以将尾数的最低位设定为 1(尾数恒置 1)。所以浮点数进行舍入处理之后反而会增大。
bkmi
2018 年 4 月 21 日
去搜搜计算机中浮点数的表示方法…
q8515620
2018 年 4 月 21 日
我是认为,精度丢失不是数值上的丢失。
精度指的是精确度(或者说是误差?)
jingous
2018 年 4 月 22 日
所谓的精度损失并不是每次都变小。
精度损失体现在两个方面:一是原始的表示不精确,二是就算过程阶码较小的元素为丢位
然后,花费半个多小时推导了过程,仅供参考:
https://pan.baidu.com/s/1XA145TEiMo2b3GgL7HkOiQ
jingous
2018 年 4 月 22 日
@silver107 更系统的查看 IEEE754 浮点表示,浮点加法。书可以看康继昌翻译的《计算机组成与设计》
rabbbit
2018 年 4 月 22 日
有些数转换成 2 进制是无限小数,双精度浮点数最多表示 52 位,因此会丢失精度.
rabbbit
2018 年 4 月 22 日
至于为啥多出来个.000004
因为超过 52 为会自动进一舍零
0.0001100110011001100110011001100110011001100110011001100
变成了
0.0001100110011001100110011001100110011001100110011001101
要是算
rabbbit
2018 年 4 月 22 日
convert('0.0100110011001100110011001100110011001100110011001100110', 2)
结果是 0.3
silver107
2018 年 4 月 22 日
@rabbbit 感谢,终于明白了。这种舍入方式是 IEEE 754 里的 Roundings to nearest 吗?
msg7086
2018 年 4 月 22 日
@silver107 二进制里不是 0 就是 1,应该没有 nearest 之分吧。
rabbbit
2018 年 4 月 22 日
@silver107
如果第 53 位是 1 就+1,如果第 53 位是 0 就不加.
例如 0.15 的 52 位尾数是 0011001100110011001100110011001100110011001100110011
因为第 53 位是 0,没加一

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/448774

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX