我不明白以下代码行中发生了什么:
>>> 123456789012345678. -123456789012345677.
0.0
结果不应该是1.0吗?
感谢。干杯:)
答案 0 :(得分:7)
浮点数只存储53位信息,因此您将受到四舍五入的影响。
改为使用整数:
>>> 123456789012345678 - 123456789012345677
1
或使用Decimal模块:
>>> from decimal import Decimal
>>> Decimal('123456789012345678.0') - Decimal('123456789012345677.0')
Decimal('1.0')
答案 1 :(得分:3)
没有确切表示123456789012345678作为浮点数:
>>> 123456789012345678.
1.2345678901234568e+17
^ oops
答案 2 :(得分:3)
Floating point numbers被存储为53位 1 的尾数加上11位指数,加上一个符号位。
您的数字需要超过53位来表示,因此使用最接近的实际可表示浮点值。
浮点数通常用于模拟真实世界系统的实际测量或模拟。很少有任何物理常数或测量结果甚至可以达到52位精度,所以这通常都可以。
1。 53 rd 位是隐藏位,但它不足以帮助您:
$ dc
2 52 ^ p
4503599627370496个
2 53 ^ p
9007199254740992个
123456789012345678<<<<你的数字更大,实际上,它需要大约56位:
2o 2 53 ^ 1-p
11111111111111111111111111111111111111111111111111111个
123456789012345678p
110110110100110110100101110100110001100001111001101001110
功能
答案 3 :(得分:1)
Float算法有一个常见的舍入问题。
What Every Computer Scientist Should Know About Floating-Point Arithmetic