Python中math.floor(4.9999999999999999)返回5的原因探究
为什么Python中math.floor(4.9999999999999999)返回5?
嘿,这个问题其实戳中了很多人对Python数值类型的误解,我来给你掰扯清楚~
首先得纠正一个关键认知:Python并不是所有数值类型都有无限精度。你听说的“无限精度”,其实指的是Python的整数(int类型)——它确实能处理任意大小的整数,不会出现溢出或者精度丢失,但浮点数(float类型)完全是另一回事!
Python里的float遵循IEEE 754双精度标准,它的有效精度大概在15-17位十进制数字左右。也就是说,当你输入的小数位数超过这个范围时,Python会自动把它近似成最接近的、能被双精度浮点数表示的数值。
拿你的例子来说,4.9999999999999999这个数的位数已经超出了双精度的精确表示范围,所以当你在Python里输入它的瞬间,它就被悄悄转换成了5.0。不信你直接打印这个数试试:
print(4.9999999999999999) # 输出结果是5.0
既然这个数已经是5.0了,那调用math.floor(5.0)返回5,自然就合情合理了——这根本不是floor函数的问题,而是输入的数值在存储时就已经被近似了。
那如果想要真正处理这种高精度的小数怎么办?可以用Python标准库的decimal模块,它支持自定义精度的十进制运算,完美解决这个问题:
from decimal import Decimal, getcontext # 先设置足够高的精度,这里设为20位 getcontext().prec = 20 # 注意要用字符串形式传入数值,避免提前被float近似 num = Decimal('4.9999999999999999') print(num) # 输出:4.9999999999999999 # 用floor处理,或者用Decimal自带的方法 import math print(math.floor(num)) # 输出:4 # 也可以用Decimal原生方法,更贴合高精度场景 print(num.to_integral_value(rounding="ROUND_FLOOR")) # 输出:4
最后再划个重点:
- Python的
float是有限精度的双精度浮点数,不存在无限精度 - 超长小数会被自动近似为最接近的可表示浮点数
- 高精度小数运算请用
decimal模块替代float
内容的提问来源于stack exchange,提问作者Ekanshdeep Gupta
相关产品推荐
相关产品推荐

