Python Decimal运算结果出现多余末尾0如何输出正确精度值
问题根源
这不是浮点数运算误差,核心是Python decimal 模块的两个规则导致的:
- 你设置的
getcontext().prec = 10约束的是总有效数字位数,不是小数点后位数。 - Decimal对象在纯加减运算、直接构造时,会保留数值的所有尾随零;只有做乘除运算按精度截断时,才会自动丢弃无意义的尾零。
你代码里的fahrenheit和romer运算过程都包含乘除步骤,所以结果自动去掉了多余尾零;而kelvin是纯加法运算,且你构造Decimal(273.15)时传入的是浮点数——虽然273.15本身的数值没错,但浮点数转Decimal时生成的数位经过全局10位有效精度截断后,就带上了多余的尾随零,最终得到285.1500000。
顺带一提,Decimal(7.5)输出正常只是巧合:7.5可以被二进制浮点数精确表示,转Decimal时不会产生额外数位。
解决方法
两种方案都可以得到你要的285.15输出:
- 方案1(推荐):构造Decimal时传入字符串而非浮点数,从根源避免多余数位生成:
改完后kelvin直接输出就是from decimal import * getcontext().prec = 10 celsius = Decimal(12) fahrenheit = celsius*9/5+32 kelvin = celsius+Decimal('273.15') # 这里传入字符串 romer = celsius*21/40+Decimal('7.5') # 这里也建议改成字符串,避免其他数值出现同类问题285.15,不需要额外处理。 - 方案2:如果已经生成了带尾随零的结果,调用
normalize()方法即可自动移除所有无意义的尾随零,不会改变实际数值:kelvin = (celsius+Decimal(273.15)).normalize()
内容的提问来源于stack exchange,提问作者John
相关产品推荐
相关产品推荐

