Python使用//与%拆分浮点数时0.30计算结果不符合预期求助
问题成因
这个问题的核心是二进制浮点数精度丢失:十进制的0.1、0.2、0.3这类小数无法被二进制浮点数精确表示,实际存储的是接近真实值的近似值。
你可以手动测试0.3 - 0.2的输出,结果并非预期的0.1,而是近似值0.09999999999999998,该数值小于0.1,因此0.09999999999999998 // 0.1的计算结果为0.0,和你遇到的现象完全吻合。
解决方法
有两种常用的无精度问题实现方案:
方案1:转整数运算(最高效稳妥)
把所有金额统一放大100倍转为整数,用整数的整除、取模运算计算,完全规避浮点数精度问题,代码示例:
# 放大100倍转整数,覆盖到0.01级别的精度需求 x = int(round(float(input('Type a number ')) * 100)) print(x // 100, "1") x = x % 100 print(x // 50, "0.50") x = x % 50 print(x // 20, "0.20") x = x % 20 print(x // 10, "0.10")
方案2:使用decimal模块做精确十进制运算
如果需要保留小数运算的形式,可以用Python标准库的decimal模块指定精度做精确计算,代码示例:
from decimal import Decimal, getcontext # 设置计算精度覆盖需求 getcontext().prec = 2 x = Decimal(input('Type a number ')) print(int(x // Decimal('1')), "1") x = x % Decimal('1') print(int(x // Decimal('0.50')), "0.50") x = x % Decimal('0.50') print(int(x // Decimal('0.20')), "0.20") x = x % Decimal('0.20') print(int(x // Decimal('0.10')), "0.10")
内容的提问来源于stack exchange,提问作者saZ
相关产品推荐
相关产品推荐

