delphij's Chaos

选择chaos这个词是因为~~实在很难找到一个更合适的词来形容这儿了……

17 Feb 2008

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__方法,所以就产生了这个看起来很奇怪的行为。