Python中浮点数的加减法是怎么工作的?
我不太明白下面这段代码在干嘛:
>>> 123456789012345678. -123456789012345677.
0.0
结果不是应该是1.0吗?
谢谢!祝好 :)
4 个回答
3
数字123456789012345678不能准确地用浮点数表示:
>>> 123456789012345678.
1.2345678901234568e+17
^ oops
3
浮点数是用53位来表示有效数字,再加上11位的指数和1位的符号位来存储的。
如果你的数字需要的位数超过53位,那么就会使用最接近的可以表示的浮点数值。
浮点数通常用来模拟现实世界的测量或系统。实际上,几乎没有物理常数或测量值能达到接近52位的精度,所以一般来说这样处理是可以的。
1. 第53位是一个隐藏位,但这对你并没有太大帮助:
$ dc
2 52^p
4503599627370496
2 53^p
9007199254740992
123456789012345678 <<<< 你的数字更大,实际上需要大约56位:
2o 2 53^1-p
11111111111111111111111111111111111111111111111111111
123456789012345678p
110110110100110110100101110100110001100001111001101001110
7
浮点数只能存储53位的信息,所以你会受到四舍五入的影响。
可以改用整数:
>>> 123456789012345678 - 123456789012345677
1
或者使用Decimal模块:
>>> from decimal import Decimal
>>> Decimal('123456789012345678.0') - Decimal('123456789012345677.0')
Decimal('1.0')