如何在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
相关产品推荐
相关产品推荐

