[ Python ] print(0.3 == (3 * 0.1)) ->False why?

2018-06-14 15:11:40 +08:00
 Leigg

转换为:
3*0.1 = 0.30000000000000004
为啥捏?

8687 次点击
所在节点    Python
45 条回复
broadliyn
2018-06-14 15:16:02 +08:00
这类问题简直就是 v2 大姨妈一样。。。
请 lz 去补习一下,计算机系统原理,原码、补码、反码、定点数、浮点数相关的章节。
SuperMild
2018-06-14 15:24:53 +08:00
重点补习一下搜索技能
nasmatic
2018-06-14 15:26:23 +08:00
Leigg
2018-06-14 16:12:18 +08:00
@nasmatic 谢谢。

@SuperMild 就是不知道咋搜啊
crayygy
2018-06-14 16:14:14 +08:00
IEEE754
Leigg
2018-06-14 16:16:12 +08:00
@broadliyn 老哥担待一下,我也不是大佬,啥都懂,总有知识缺口。
rabbbit
2018-06-14 16:18:06 +08:00
kingname
2018-06-14 16:22:10 +08:00
0.3 转换为二进制:
0.3 * 2 = 0.6 -> 0
0.6 * 2 = 1.2 -> 1
0.2 * 2 = 0.4 -> 0
0.4 * 0.2 = 0.8 -> 0
0.8 * 2 = 1.6 -> 1
0.6 * 2 = 1.2 -> 1
如此循环

所以 0.3 对应的二进制数为 0.01001100110011001 ……无限循环下去。

而电脑会把这个无限循环的东西截断为:0.0100110011001100110011001100110011001100110011001101

这个截断以后的二进制再转换回十进制,就变成了 0.30000000000000004
ihancheng
2018-06-14 16:23:20 +08:00
离散数学了解下?
cuzfinal
2018-06-14 16:53:05 +08:00
zynlp
2018-06-14 16:54:41 +08:00
加个 round
araraloren
2018-06-14 16:55:12 +08:00
IEEE754 实现的浮点就是这样的,有的语言有支持无限精度的浮点数,比如

#!/usr/bin/perl6
# your code goes here

# default is Rat
say 0.333.WHAT;
say 0.2222 - 0.22 - 0.0005;
say 0.2222 - 0.22 - 0.0005 == 0.0017;

# Num is IEEE754 number
say 0.255.Num.WHAT;
say 0.2222.Num - 0.22.Num - 0.0005.Num;

have a try: https://ideone.com/CckupN
jmc891205
2018-06-14 17:08:40 +08:00
永远不要用==去比较浮点数
suilin
2018-06-14 17:43:01 +08:00
几位大佬包容下嘛(手动狗头
robinlovemaggie
2018-06-14 17:44:09 +08:00
打个比方:你把一个蛋糕切成三块再拼到一起,它还是一个蛋糕吗?
SingeeKing
2018-06-14 17:45:55 +08:00
涉及浮点数判断请使用 round

0.3 == round(3 * 0.1, 2)
robinlovemaggie
2018-06-14 18:01:25 +08:00
ipwx
2018-06-14 18:27:49 +08:00
十进制的准确值换算成二进制可能就要写无穷多位… 比如 1/10=1/16+1/32+1/256+1/512+…,所以对应二进制就是 0.00011001100110011 …
Allianzcortex
2018-06-14 21:02:37 +08:00
Raymon111111
2018-06-14 21:45:21 +08:00
科班出身真的挺重要的

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

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

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

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

© 2021 V2EX