You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

统一四舍五入方式的方法

方法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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 09:47:17