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

如何在Python中保存1/3的精确值?解决浮点数精度丢失问题

如何在Python中保存1/3的精确值

你遇到的问题源于float类型的本质:它基于IEEE 754二进制浮点数标准,无法精确表示1/3这类十进制无限循环小数——因为1/3在二进制下同样是无限循环的,存储时只能做近似处理,所以输出会出现误差。

以下是几种实现精确表示的方案:

1. 用fractions模块存储分数形式

这个模块直接保存分子和分母,完美保留1/3的精确值,还能按需格式化输出循环小数:

from fractions import Fraction

# 精确存储1/3
x = Fraction(1, 3)
print(x)  # 输出: 1/3

# 自定义格式化,输出指定位数的循环小数
def format_repeating_decimal(frac, max_digits):
    integer_part = frac.numerator // frac.denominator
    remainder = frac.numerator % frac.denominator
    digits = []
    remainder_map = {}
    repeat_start = None

    for _ in range(max_digits):
        if remainder in remainder_map:
            repeat_start = remainder_map[remainder]
            break
        remainder_map[remainder] = len(digits)
        remainder *= 10
        digits.append(str(remainder // frac.denominator))
        remainder %= frac.denominator

    decimal_str = ''.join(digits)
    if repeat_start is not None:
        decimal_str = f"{decimal_str[:repeat_start]}({decimal_str[repeat_start:]})..."
    
    return f"{integer_part}.{decimal_str}"

# 输出50位带循环标记的小数
print(format_repeating_decimal(x, 50))  # 输出: 0.33333333333333333333333333333333333333333333333333...

2. 用decimal模块控制高精度小数

通过设置精度,可以得到足够多的小数位来模拟无限循环:

from decimal import Decimal, getcontext

# 设置精度为100位
getcontext().prec = 100
x = Decimal(1) / Decimal(3)
print(x)  # 输出: 0.3333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333333

3. 直接用字符串表示循环小数

如果仅需要展示精确的无限循环形式,直接存储字符串是最直接的方式:

x = "0.333333333333333333333333333333333333333333333333333..."
print(x)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 22:20:32