Python中浮点数的加减法是怎么工作的?

0 投票
4 回答
5521 浏览
提问于 2025-04-17 05:43

我不太明白下面这段代码在干嘛:

>>> 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')

撰写回答