Python的浮点数 __str__ 方法的小问题
今天 康神 发现一个浮点数的问题,一个 class 里面有两个浮点(double) 成员 x、y,然后用 return (self.x, self.y).__str__() 返回时,发现输出是 (39.210279999999997, 116.34528) 而不是希望的 (116.345280, 39.210280)。
查了一下,改成 return “(%f, %f)” % (self.x, self.y) 解决。C里面printf的 %f 默认显示小数点后面6位,但是 __str__ 似乎自己对于浮点数精度有些想法?没看 Python 具体的实现。
Archived: 4 Comments
momo | February 18, 2008 11:19 AM
Python 2.2.1 (#1, Aug 30 2002, 12:15:30)
[GCC 3.2 20020822 (Red Hat Linux Rawhide 3.2-4)] on linux2
Type “help”, “copyright”, “credits” or “license” for more information.
class Me:
…
File “”, line 2
^
IndentationError: expected an indented block
class Me:
… def __init__(self):
… self.a = 3.3
… self.b = 4.2
… def __str__(self):
… return (self.a, self.b).__str__()
…
my = Me()
print my
(3.2999999999999998, 4.2000000000000002)
momo | February 18, 2008 11:21 AM
IronPython 1.1 (1.1) on .NET 2.0.50727.1433
Copyright (c) Microsoft Corporation. All rights reserved.
class Me:
… def __init__(self):
… self.a = 3.3
… self.b = 2.22
… def __str__(self):
… return (self.a, self.b).__str__()
…
my = Me()
print my
(3.3, 2.22)
momo | February 18, 2008 11:24 AM
你就不能贴一点原始的证据吗?
xyb | February 18, 2008 4:41 PM
看起来这里面同时涉及到浮点数精度问题以及python中repr和str转换数字、对象到字符串的问题。请看以下示例:
x=39.21028
y=39.210279999999997
x==y
True
x
39.210279999999997
print x
39.21028
repr(x)
‘39.210279999999997’
str(x)
‘39.21028’
float同时有__str__和__float__两个类方法,他们的表现有时是不太一样的。而tuple只有__float__方法,(self.x, self.y).__str__()实际上是通过tuple.__repr__调用的float.__repr__方法,所以就产生了这个看起来很奇怪的行为。