Python 3.6.8中round函数四舍五入结果不一致问题求助
为什么Python中round(59.9250,2)和round(459.4250,2)结果不同?
原因解析
这两个结果差异来自两个核心点:
- 浮点数的二进制存储精度限制:Python使用IEEE 754双精度浮点数存储十进制小数,但很多十进制小数无法被精确表示为二进制。比如:
59.9250实际存储的二进制转换回十进制后是略小于59.925的值(可通过print("{0:.20f}".format(59.9250))验证,输出为59.92499999999999715783)459.4250实际存储的是略大于459.425的值(验证输出为459.42500000000001776357)
- round函数的“银行家舍入法”:Python的
round默认采用“四舍六入五成双”规则——当舍去部分恰好是5时,会让保留的最后一位变为偶数。结合上面的精度误差:- 对于略小于59.925的值,round到两位小数时,实际是对
59.924999...进行舍入,结果为59.92 - 对于略大于459.425的值,round到两位小数时,实际是对
459.425000...进行舍入,结果为459.43
- 对于略小于59.925的值,round到两位小数时,实际是对
统一四舍五入方式的方法
方法1:使用decimal模块(推荐)
decimal模块可以精确控制十进制运算和舍入规则,完全避免浮点数精度问题。如果需要统一使用传统的“四舍五入”(即舍去部分≥5时进一位),可以设置ROUND_HALF_UP模式:
from decimal import Decimal, ROUND_HALF_UP n = Decimal('59.9250') n1 = Decimal('459.4250') print(n.quantize(Decimal('0.00'), rounding=ROUND_HALF_UP)) # 输出59.93 print(n1.quantize(Decimal('0.00'), rounding=ROUND_HALF_UP)) # 输出459.43
注意:初始化Decimal时要传入字符串形式的数值,不要直接传浮点数,避免精度误差带入。
方法2:自定义浮点数舍入函数
如果不想引入decimal模块,可以通过放大倍数后处理的方式实现传统四舍五入,但这种方法在极端浮点数场景下仍可能存在精度问题:
import math def round_traditional(x, decimals): multiplier = 10 ** decimals return math.floor(x * multiplier + 0.5) / multiplier print(round_traditional(59.9250, 2)) # 输出59.93 print(round_traditional(459.4250, 2)) # 输出459.43
内容的提问来源于stack exchange,提问作者Merfan
相关产品推荐
相关产品推荐

