鱼C论坛

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

浮点数精度的问题,新人求助,急

[复制链接]
发表于 2017-4-15 13:08:52 | 显示全部楼层 |阅读模式
5鱼币
我在做一个计算器软件,在实现倒数功能的时候发现 例如 6的倒数是1.666666666666667,再将结果求倒得到5.999999999999999.类似的精度问题该怎么解决啊?大神帮帮忙.在线等!

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-4-15 13:45:33 | 显示全部楼层
浮点数误差

浮点数一个普遍的问题就是在计算机的世界中,浮点数并不能准确地表示十进制。并且,即便是最简单的数学运算,也会带来不可控制的后果。因为,在计算机的世界中只认识0与1。

  1. >>> x = 4.20
  2. >>> y = 2.10
  3. >>> x + y
  4. 6.3000000000000007
  5. >>> (x+y) == 6.3
  6. False
  7. >>> x = 1.2
  8. >>> y = 2.3
  9. >>> x + y
  10. 3.5
  11. >>> (x + y) == 3.5
  12. True
复制代码

上述种种问题,就来自于计算机的cpu与浮点数的表示方式,我们自己在代码层面是没法控制的。在有些需要精确表示浮点数的场合,例如财务结算,这些误差就不可接受。

decimal模块进行十进制数学计算

Python中的decimal模块可以解决上面的烦恼
decimal模块中,可以通过整数,字符串或原则构建decimal.Decimal对象。如果是浮点数,特别注意因为浮点数本身存在误差,需要先将浮点数转化为字符串。

  1. >>> from decimal import Decimal
  2. >>> from decimal import getcontext
  3. >>> Decimal('4.20') + Decimal('2.10')
  4. Decimal('6.30')
  5. >>> from decimal import Decimal
  6. >>> from decimal import getcontext
  7. >>> x = 4.20
  8. >>> y = 2.10
  9. >>> z = Decimal(str(x)) + Decimal(str(y))
  10. >>> z
  11. Decimal('6.3')
  12. >>> getcontext().prec = 4 #设置精度
  13. >>> Decimal('1.00') /Decimal('3.0')
  14. Decimal('0.3333')
复制代码

当然精度提升的同时,肯定带来的是性能的损失。在对数据要求特别精确的场合(例如财务结算),这些性能的损失是值得的。但是如果是大规模的科学计算,就需要考虑运行效率了。毕竟原生的float比Decimal对象肯定是要快很多的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-4-15 13:46:47 | 显示全部楼层
做计算机
做完贴上来,多多交流哈
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-4-15 22:59:44 | 显示全部楼层
将计算结果想办法保存为分数形式。

没试过!可以考虑下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-3-29 22:56

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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