Python论坛  - 讨论区

标题:[python-chinese] 小数问题 round

2006年07月25日 星期二 17:03

iconic iconic at 126.com
Tue Jul 25 17:03:10 HKT 2006

边学习边发现问题,使用 python 2.43 刚刚发现python也有同样的小数问题,就是
后缀999999问题.原先在Java中,这个问题搞得我头大,用了好多方法才勉强避免.不
知道在 python中有没有好的解决方法? 测试效果代码:
>>> round(11/3.0, 2)
3.6699999999999999
我期望输出结果当然是3.67,问题就在这里.好像所有的编程语言都会出现这种问
题,是2进制计数计算导致的吧.请问有什么好的办法避免此类问题?最好可以解释一
下此类问题发生的原因.谢谢!


[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2006年07月25日 星期二 17:10

limodou limodou at gmail.com
Tue Jul 25 17:10:55 HKT 2006

On 7/25/06, iconic <iconic at 126.com> wrote:
>
> 边学习边发现问题,使用 python 2.43 刚刚发现python也有同样的小数问题,就是
> 后缀999999问题.原先在Java中,这个问题搞得我头大,用了好多方法才勉强避免.不
> 知道在 python中有没有好的解决方法? 测试效果代码:
> >>> round(11/3.0, 2)
> 3.6699999999999999
> 我期望输出结果当然是3.67,问题就在这里.好像所有的编程语言都会出现这种问
> 题,是2进制计数计算导致的吧.请问有什么好的办法避免此类问题?最好可以解释一
> 下此类问题发生的原因.谢谢!
>
这种问题在以前的邮件中有讨论。主要原因是浮点数本身就是这样存的。对于计算来说没有关系,如果只是输出可以使用格式化输出,如:

"%.2f"

还有一个decimal的模块可以专门作这件事,你可以查一查。


-- 
I like python!
My Blog: http://www.donews.net/limodou
My Django Site: http://www.djangocn.org
NewEdit Maillist: http://groups.google.com/group/NewEdit

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2006年07月25日 星期二 17:19

Leo Jay python.leojay at gmail.com
Tue Jul 25 17:19:10 HKT 2006

On 7/25/06, iconic <iconic at 126.com> wrote:
>
>
> 边学习边发现问题,使用 python 2.43 刚刚发现python也有同样的小数问题,就是
> 后缀999999问题.原先在Java中,这个问题搞得我头大,用了好多方法才勉强避免.不
> 知道在 python中有没有好的解决方法? 测试效果代码:
> >>> round(11/3.0, 2)
> 3.6699999999999999
> 我期望输出结果当然是3.67,问题就在这里.好像所有的编程语言都会出现这种问
> 题,是2进制计数计算导致的吧.请问有什么好的办法避免此类问题?最好可以解释一
> 下此类问题发生的原因.谢谢!
>
> 小数部分由十进制转二进制的方法就是一直去掉整数部分,小数部分乘2,直到小数部分为0为止。
如:0.625转为二进制:
0.625*2 = 1.25,  整数部分为1,小数部分为0.25
0.25 * 2 = 0.5 ,  整数部分为0,小数部分为0.5
0.5  * 2 = 1   ,    整数部分为1,小数部分为0
所以0.625转为二进制的结果就是0.101
但是,有些小数,如0.2,再怎么乘2,小数部分也不会得到0的,所以,就有误差了。

在输出的时候你可以用格式控制来指定小数位数,如:"%.2f" % (11/3.0)会输出3.67
或者可以用python 2.4新加的decimal模块来做精确的运算。

-- 
Best Regards,
Leo Jay
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.exoweb.net/pipermail/python-chinese/attachments/20060725/77c62642/attachment.htm

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2006年07月25日 星期二 18:12

温铭 moonbingbing at gmail.com
Tue Jul 25 18:12:41 HKT 2006

在命令行里面输入round(11/3.0, 2),结果确实是3.6699999999999999。
但在IDLE里面输入print round(11/3.0, 2),按F5运行,结果却是3.67。楼主可以试一试。
不知道为什么会这样?有谁能解释一下不?


在06-7-25,iconic <iconic at 126.com> 写道:
>
>
> 边学习边发现问题,使用 python 2.43 刚刚发现python也有同样的小数问题,就是
> 后缀999999问题.原先在Java中,这个问题搞得我头大,用了好多方法才勉强避免.不
> 知道在 python中有没有好的解决方法? 测试效果代码:
> >>> round(11/3.0, 2)
> 3.6699999999999999
> 我期望输出结果当然是3.67,问题就在这里.好像所有的编程语言都会出现这种问
> 题,是2进制计数计算导致的吧.请问有什么好的办法避免此类问题?最好可以解释一
> 下此类问题发生的原因.谢谢!
>
> _______________________________________________
> python-chinese
> Post: send python-chinese at lists.python.cn
> Subscribe: send subscribe to python-chinese-request at lists.python.cn
> Unsubscribe: send unsubscribe to  python-chinese-request at lists.python.cn
> Detail Info: http://python.cn/mailman/listinfo/python-chinese
>



-- 
温铭
welcome to my blog : http://blog.csdn.net/wayne92
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.exoweb.net/pipermail/python-chinese/attachments/20060725/d05fe8ce/attachment.html

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2006年07月25日 星期二 18:33

Leo Jay python.leojay at gmail.com
Tue Jul 25 18:33:35 HKT 2006

On 7/25/06, 温铭 <moonbingbing at gmail.com> wrote:
>
> 在命令行里面输入round(11/3.0, 2),结果确实是3.6699999999999999。
> 但在IDLE里面输入print round(11/3.0, 2),按F5运行,结果却是3.67。楼主可以试一试。
> 不知道为什么会这样?有谁能解释一下不?
>
>

区别在于你在命令行里没有写print,而在IDLE里写了print。
print在输出的时候是有区别的。
直接在控制台里写变量名,然后回车,调用的是对象的__repr__函数,
print用的是__str__函数。

>>> class A:
...     def __repr__(self):
...             return 'repr'
...     def __str__(self):
...             return 'str'
...
>>> a = A()
>>> a
repr
>>> print a
str
>>>

-- 
Best Regards,
Leo Jay
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.exoweb.net/pipermail/python-chinese/attachments/20060725/857f9dce/attachment.htm

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2006年07月25日 星期二 18:57

Leo Jay python.leojay at gmail.com
Tue Jul 25 18:57:35 HKT 2006

On 7/25/06, Leo Jay <python.leojay at gmail.com> wrote:
>
>
> 区别在于你在命令行里没有写print,而在IDLE里写了print。
>  print在输出的时候是有区别的。
> 直接在控制台里写变量名,然后回车,调用的是对象的__repr__函数,
> print用的是__str__函数。
>
> >>> class A:
> ...     def __repr__(self):
> ...             return 'repr'
> ...     def __str__(self):
> ...             return 'str'
> ...
> >>> a = A()
> >>> a
> repr
> >>> print a
> str
> >>>
>

去看了一下python的源代码,对浮点数d的repr和str分别等价于:
"%.17g" % d和"%.12g" % d
一般的double有效位只有16位,所以"%.17g"相当于有多少位就输出多少位。
而"%.12g"就会引起小数点后第13位向前进位,从而得到3.67的结果。


-- 
Best Regards,
Leo Jay
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.exoweb.net/pipermail/python-chinese/attachments/20060725/83c98de5/attachment.html

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

2006年07月26日 星期三 08:11

shhgs shhgs.efhilt at gmail.com
Wed Jul 26 08:11:43 HKT 2006

这是计算机内部浮点数表示的问题。有兴趣可以看看IEEE 754的文档。

此外,可以使用decimal模块。


On 7/25/06, Leo Jay <python.leojay at gmail.com> wrote:
>
> On 7/25/06, Leo Jay <python.leojay at gmail.com> wrote:
> >
> >
> > 区别在于你在命令行里没有写print,而在IDLE里写了print。
> >
> > print在输出的时候是有区别的。
> > 直接在控制台里写变量名,然后回车,调用的是对象的__repr__函数,
> > print用的是__str__函数。
> >
> > >>> class A:
> > ...     def __repr__(self):
> > ...             return 'repr'
> > ...     def __str__(self):
> > ...             return 'str'
> > ...
> > >>> a = A()
> > >>> a
> > repr
> > >>> print a
> > str
> > >>>
> >
>
>
> 去看了一下python的源代码,对浮点数d的repr和str分别等价于:
> "%.17g" % d和"%.12g" % d
> 一般的double有效位只有16位,所以"%.17g"相当于有多少位就输出多少位。
> 而"%.12g"就会引起小数点后第13位向前进位,从而得到3.67的结果。
>
>
> --
> Best Regards,
> Leo Jay
> _______________________________________________
> python-chinese
> Post: send python-chinese at lists.python.cn
> Subscribe: send subscribe to
> python-chinese-request at lists.python.cn
> Unsubscribe: send unsubscribe to
> python-chinese-request at lists.python.cn
> Detail Info:
> http://python.cn/mailman/listinfo/python-chinese
>
>

[导入自Mailman归档:http://www.zeuux.org/pipermail/zeuux-python]

如下红色区域有误,请重新填写。

    你的回复:

    请 登录 后回复。还没有在Zeuux哲思注册吗?现在 注册 !

    Zeuux © 2025

    京ICP备05028076号