发现 Python 的一个坑。。。

2016-06-05 19:54:58 +08:00
 hard2reg

不知道是不是所有语言都是这样的。。

#我用的是Python3
a = 1 / 3
# 这时候 a 打印出来应该是 0.333333333
b = 1 / a
# 这时候打印 b 居然输出的是 3

这说明 Python 在内部是以分数的形式储存无限循环小数的?

还是我孤陋寡闻了。。。。

9209 次点击
所在节点    Python
60 条回复
clino
2016-06-05 19:58:20 +08:00
明明 1/3 是 0
>>> print 1/3
0
hard2reg
2016-06-05 20:00:20 +08:00
@clino 我用的是 Python3
Yc1992
2016-06-05 20:00:44 +08:00
明明 1/3 = 0
b = 1/0 = ∞
hard2reg
2016-06-05 20:02:02 +08:00
@Yc1992 我 Python3 。。。。
publicID002
2016-06-05 20:02:18 +08:00
应该是输出的时候位数默认不多有舍入
wsy2220
2016-06-05 20:04:41 +08:00
浮点计算不保证结果精确的,换一个数甚至换一个机器结果就不一样了
Kisesy
2016-06-05 20:08:03 +08:00
py
0.3333333333333333 3.0
go
0.3333333333333333 3
shuax
2016-06-05 20:08:48 +08:00
print(2.999999999999999999999999999)
billlee
2016-06-05 20:26:40 +08:00
不要依赖未定义行为
clino
2016-06-05 20:32:10 +08:00
py3 的表现也合理啊
>>> print(1/3)
0.3333333333333333
>>> print(1/(1/3))
3.0
>>> print(1/0.3333333333333333)
3.0
justjavac
2016-06-05 20:34:10 +08:00
是你孤陋寡闻了。
浮点数的内部表示和浮点数的显示是两码事
justjavac
2016-06-05 20:36:19 +08:00
pimin
2016-06-05 20:40:41 +08:00
我发现数学的一个坑
1/3=0.3333333...
0.33333*3<1
3*1/3=1
ipconfiger
2016-06-05 20:44:07 +08:00
楼举不是计算机科班出身的吧, 先搞清楚二进制怎么存储浮点数就清楚了,如果我记得没错应该是在计算机组成原理的课本里有
hadoop
2016-06-05 20:46:30 +08:00
@pimin 0.3333.....≠ 0.33333
hard2reg
2016-06-05 20:48:00 +08:00
@justjavac 大神啊,要出版了
hard2reg
2016-06-05 20:49:02 +08:00
@pimin 我没有任何这个意思。。。
fy
2016-06-05 20:55:45 +08:00
日常又发现一个坑。。。
hard2reg
2016-06-05 21:03:36 +08:00
@justjavac 貌似 JS 和 Python 都会出现 0.2 + 0.4 ≠ 0.6 的情况,但是我用 C++试了下输出的是 0.6 。请问这是为啥。。

float a;
a = 0.2 + 0.4;
cout << a << endl;

如果想要让 JS 和 Python 正确输出 0.6 改如何写。。
jimmyye
2016-06-05 21:13:13 +08:00
要用 decimal 之类的库

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

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

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

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

© 2021 V2EX