鱼C论坛

 找回密码
 立即注册
查看: 10|回复: 3

[作品展示] 告别0.1+0.2=0.30000004!更精确的浮点数计算器!

[复制链接]
发表于 前天 17:27 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

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

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

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

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


  4. def to_decimal(value):
  5.     return Decimal(str(value))


  6. def add(a, b):
  7.     return to_decimal(a) + to_decimal(b)


  8. def subtract(a, b):
  9.     return to_decimal(a) - to_decimal(b)


  10. def multiply(a, b):
  11.     return to_decimal(a) * to_decimal(b)


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


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

  22.     numbers = []
  23.    
  24.     while True:
  25.         try:
  26.             user_input = input("Enter a number (or 'done' to finish): ").strip()
  27.             
  28.             if user_input.lower() == 'done':
  29.                 if not numbers:
  30.                     print("No numbers entered. Please enter at least one number.")
  31.                     continue
  32.                 break
  33.             
  34.             # Convert input to Decimal
  35.             number = to_decimal(user_input)
  36.             numbers.append(number)
  37.             print(f"  Added: {number}")
  38.             
  39.         except (ValueError, TypeError, InvalidOperation):
  40.             print(f"  ❌ Invalid input: '{user_input}'. Please enter a valid number.")
  41.             continue
  42.    
  43.     result = Decimal('0')
  44.     for value in numbers:
  45.         result += value
  46.    
  47.     print("\n" + "=" * 50)
  48.     print(f"Numbers entered: {', '.join(str(n) for n in numbers)}")
  49.     print(f"Sum = {result}")
  50.     print("=" * 50)

  51. print("\nThanks for using the Precise Decimal Calculator!")
复制代码


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

多谢各位鱼油支持~
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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


以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 前天 17:47 | 显示全部楼层
FishC 发表于 2026-8-18 17:29
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

好滴~已在github端完成修改
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 前天 17:47 | 显示全部楼层
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 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-8-20 23:09

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表