这是不是python的bug

lucky-lucky 2012-05-01 11:32:41
做运算的时候发现python把1/28.0计算错了

1/28.0计算下来应该是个循环小数吧
0.03(571428)
括号里面是循环小数
可是python这样计算下来居然不循环,害死我了啊,找了半天bug,居然在这里

>>> decimal.Decimal(1/28.0)
Decimal('0.03571428571428571230317317031222046352922916412353515625')

求高人指点python中怎样做才能准确无误的计算
...全文
142 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
anonymous2102 2012-05-01
  • 打赏
  • 举报
回复
又想了下,似乎我3楼说的也没错,只是可能需要像4楼说的这样做。
D(1)/28就可以,D(1)/28.0就不行,看起来好像还做了自动转换了的样子。
anonymous2102 2012-05-01
  • 打赏
  • 举报
回复
哦,原来是这样,我3楼的理解错了。学习了
angel_su 2012-05-01
  • 打赏
  • 举报
回复
用浮点浮点起实例,只有2进制能完美对应的时候才行,所以一般小数都是用字串吧...
>>> from decimal import *
>>> Decimal(1.25) # 侥幸是个2进制刚好能表示的
Decimal('1.25')
>>> Decimal(3.14) # 出差错了
Decimal('3.140000000000000124344978758017532527446746826171875')
>>> Decimal('3.14') # 小数用字串才对
Decimal('3.14')
>>> getcontext().prec = 64
>>> Decimal(1)/28
Decimal('0.03571428571428571428571428571428571428571428571428571428571428571')
>>>
anonymous2102 2012-05-01
  • 打赏
  • 举报
回复
不对的那个应该是先进行了实点数运算才转换成Decimal的吧,进行运算时结果已经不精确了,再转换成Decimal就是那个不精确的结果了。大概是这样吧
lucky-lucky 2012-05-01
  • 打赏
  • 举报
回复
谢谢楼上,问题解决了,就是不明白上一种情况出了什么情况
anonymous2102 2012-05-01
  • 打赏
  • 举报
回复
csdn说我贴的这些语句里有非法字符,只好截个图发一下了。

37,741

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • WuKongSecurity@BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧