Python中数字取整结果异常?是否为计算错误或认知疏漏
这不是计算错误,是浮点数存储的认知遗漏!
你遇到的这个情况,是Python(以及绝大多数现代编程语言)处理浮点数时的经典“精度陷阱”——完全不是计算错误,而是你对二进制浮点数的存储本质不了解导致的认知偏差。
核心原因:十进制小数无法精确转二进制
计算机底层用二进制存储浮点数,但很多十进制小数(比如0.005、90.005)在二进制中是无限循环的小数,只能存储它们的近似值。这就导致你写的0.005、90.005这些字面量,实际在内存里的数值和你看到的十进制数有细微差异。
针对你的例子具体拆解
我们可以用repr()函数查看这些浮点数的真实存储值(它会输出最接近实际存储的十进制表示):
print(repr(0.005)) print(repr(90.005)) print(repr(90.015))
运行结果大概是:
0.005000000000000000104083408558608425664715468883514404296875 90.0049999999999971578290569595992565155029296875 90.015000000000005684341886080801486968994140625
0.005实际存储的是略大于0.005的数值,所以%.2f四舍五入后得到0.0190.005实际存储的是略小于90.005的数值,所以四舍五入后得到90.0090.015实际存储的是略大于90.015的数值,所以四舍五入后得到90.02
如何实现“符合直觉”的四舍五入?
如果需要精确的十进制四舍五入(比如金融、统计场景),推荐使用Python的decimal模块——它基于十进制运算,完全避免二进制浮点数的精度问题:
from decimal import Decimal, ROUND_HALF_UP # 注意要用字符串传入数值,避免浮点数本身的精度损失 a = Decimal('0.005') b = Decimal('90.005') c = Decimal('90.015') print(a.quantize(Decimal('0.00'), rounding=ROUND_HALF_UP)) # 输出: 0.01 print(b.quantize(Decimal('0.00'), rounding=ROUND_HALF_UP)) # 输出: 90.01 print(c.quantize(Decimal('0.00'), rounding=ROUND_HALF_UP)) # 输出: 90.02
这样就能得到符合我们日常认知的四舍五入结果了。
内容的提问来源于stack exchange,提问作者Shivendra Saxena
相关产品推荐
相关产品推荐

