告别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,直接搜我即可
多谢各位鱼油支持~ 新鱼油你好!这个用 decimal 模块做精确计算的思路非常棒,确实能解决二进制浮点数带来的误差问题。不过代码里有个小坑:定义 numbers 时少了初始值,应该写成 numbers = [],否则直接 append 会报错。另外建议把 to_decimal 的转换统一用 Decimal(str(value)) 处理,避免直接传入 float 时产生误差。整体逻辑很清晰,继续加油!
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 FishC 发表于 2026-8-18 17:29
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
好滴~已在github端完成修改{:5_106:} 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]