VIRUS_2091 发表于 3 天前

告别0.1+0.2=0.30000004!更精确的浮点数计算器!

作为新鱼油,你是否也为python的浮点数运算结果所困扰?
0.1+0.2=0.300000004?!
0.1+0.2!=0.3?!!!

这个以decimal模块为核心的浮点数计算器可以完美地解决类似的问题
让python像人类一样计算小数!

代码如下:
from decimal import Decimal, getcontext, InvalidOperation

# Increase precision for calculations
getcontext().prec = 28


def to_decimal(value):
    return Decimal(str(value))


def add(a, b):
    return to_decimal(a) + to_decimal(b)


def subtract(a, b):
    return to_decimal(a) - to_decimal(b)


def multiply(a, b):
    return to_decimal(a) * to_decimal(b)


def divide(a, b):
    if to_decimal(b) == 0:
      raise ValueError("Division by zero is not allowed.")
    return to_decimal(a) / to_decimal(b)


if __name__ == "__main__":
    print("=" * 50)
    print("Precise Decimal Calculator")
    print("=" * 50)
    print("Enter float-point numbers to calculate their sum.")
    print("Type 'done' when finished.\n")

    numbers = []
   
    while True:
      try:
            user_input = input("Enter a number (or 'done' to finish): ").strip()
            
            if user_input.lower() == 'done':
                if not numbers:
                  print("No numbers entered. Please enter at least one number.")
                  continue
                break
            
            # Convert input to Decimal
            number = to_decimal(user_input)
            numbers.append(number)
            print(f"Added: {number}")
            
      except (ValueError, TypeError, InvalidOperation):
            print(f"❌ Invalid input: '{user_input}'. Please enter a valid number.")
            continue
   
    result = Decimal('0')
    for value in numbers:
      result += value
   
    print("\n" + "=" * 50)
    print(f"Numbers entered: {', '.join(str(n) for n in numbers)}")
    print(f"Sum = {result}")
    print("=" * 50)

print("\nThanks for using the Precise Decimal Calculator!")

也可以访问github,直接搜我即可

多谢各位鱼油支持~

FishC 发表于 3 天前

新鱼油你好!这个用 decimal 模块做精确计算的思路非常棒,确实能解决二进制浮点数带来的误差问题。不过代码里有个小坑:定义 numbers 时少了初始值,应该写成 numbers = [],否则直接 append 会报错。另外建议把 to_decimal 的转换统一用 Decimal(str(value)) 处理,避免直接传入 float 时产生误差。整体逻辑很清晰,继续加油!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

VIRUS_2091 发表于 3 天前

FishC 发表于 2026-8-18 17:29
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

好滴~已在github端完成修改{:5_106:}

FishC 发表于 3 天前

VIRUS_2091 发表于 2026-08-18 17:47
FishC 发表于 2026-8-18 17:29
以上回复来自 FishC A ...

欢迎新鱼油! 不错的分享,decimal模块确实是解决浮点数精度问题的利器。不过代码中有个小问题:numbers = 似乎没赋值,应该是 numbers = [] 哦。

另外,你定义的加、减、乘、除函数很实用,但主程序只用了加法。可以增加一个功能选择,让用户选择运算类型,这样更完整。

关于异常捕获,InvalidOperation 可以捕获,但也可以考虑捕获 decimal.DivisionByZero 等更具体的异常,不过你已经手动检查了除零,没问题。

最后,提醒大家:使用 Decimal(str(value)) 比 Decimal(value) 更安全,能避免二进制的初始误差。

继续加油!{:5_124:}

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: 告别0.1+0.2=0.30000004!更精确的浮点数计算器!