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

Python如何正确打印数字小数部分 解决浮点舍入精度异常问题

问题本质

你遇到的精度偏差是二进制浮点数的固有特性:Python默认的float类型是双精度二进制浮点数,无法精确存储0.34这类十进制有限小数,内存中存储的是10.34的近似值,直接做n - int(n)的数值运算,自然会得到带误差的结果,这不是代码逻辑错误,是底层存储机制决定的。

仅用Python自带基础工具的实现方案

以下方案均不需要安装任何第三方库,完全符合基础工具要求:

  • 方案1:直接拆分原始输入字符串(零精度损失,最适配输入场景)
    input()函数读取到的内容本身就是字符串格式,不需要提前转成float,直接按小数点拆分就能拿到精确的小数部分:

    raw_num = input().strip()
    if '.' in raw_num:
        _, dec_part = raw_num.split('.', 1)
        fractional = float(f'0.{dec_part}')
    else:
        fractional = 0.0
    print(fractional)
    

    输入10.34时,这段代码会直接输出0.34。

  • 方案2:用标准库decimal做精确十进制运算(适合后续还要做小数计算的场景)
    decimal是Python自带的标准库,专门用于精确十进制运算,不会出现二进制浮点的精度问题:

    from decimal import Decimal
    
    n = Decimal(input().strip())
    fractional = n - int(n)
    print(fractional)
    

    这个方案不仅能正确取出小数部分,后续对小数做加减乘除也不会出现类似0.33999999999999986的误差。

  • 方案3:浮点结果按精度四舍五入(仅适合提前明确小数位数的场景)
    如果你必须全程使用float类型运算,可以根据业务需要的小数位数对结果做round截断:

    n = float(input())
    # 这里的2代表保留2位小数,可根据实际需求调整
    fractional = round(n - int(n), 2)
    print(fractional)
    

    注意这个方案存在边界精度风险,仅适合对精度要求不极端、且明确知道小数位数的场景。

注意:不存在任何二进制浮点数运算技巧能彻底规避这类误差,只要你把十进制小数转成float存储,值本身就是近似的,运算出偏差是必然结果。

内容的提问来源于stack exchange,提问作者user19541980

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 12:24:58