2006年07月25日 星期二 17:03
边学习边发现问题,使用 python 2.43 刚刚发现python也有同样的小数问题,就是 后缀999999问题.原先在Java中,这个问题搞得我头大,用了好多方法才勉强避免.不 知道在 python中有没有好的解决方法? 测试效果代码: >>> round(11/3.0, 2) 3.6699999999999999 我期望输出结果当然是3.67,问题就在这里.好像所有的编程语言都会出现这种问 题,是2进制计数计算导致的吧.请问有什么好的办法避免此类问题?最好可以解释一 下此类问题发生的原因.谢谢!
2006年07月25日 星期二 17:10
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
2006年07月25日 星期二 17:19
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
2006年07月25日 星期二 18:12
在命令行里面输入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
2006年07月25日 星期二 18:33
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
2006年07月25日 星期二 18:57
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
2006年07月26日 星期三 08:11
这是计算机内部浮点数表示的问题。有兴趣可以看看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 > >
Zeuux © 2025
京ICP备05028076号