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

2018-04-21 22:18:01 +08:00
 silver107

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

( 0.1 + 0.2 = 0.30000000000000004 )

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