相关疑难解决方法(0)

__str__和__repr__之间的区别?

之间有什么区别__str____repr____str__

python repr magic-methods

2545
推荐指数
21
解决办法
61万
查看次数

为什么str(float)在Python 3中返回的数字比Python 2多?

在Python 2.7中,repra float返回最接近17位数的最接近的十进制数; 这足够精确,可以唯一地标识每个可能的IEEE浮点值.str一个float类似的工作,除了它将结果限制为12位数; 对于大多数用途,这是一个更合理的结果,并使您免受二进制和十进制表示之间的细微差别.

Python 2演示:http://ideone.com/OKJtxv

print str(1.4*1.5)
2.1
print repr(1.4*1.5)
2.0999999999999996
Run Code Online (Sandbox Code Playgroud)

在Python 3.2中它出现strrepr返回相同的东西.

Python 3演示:http://ideone.com/oAKRsb

print(str(1.4*1.5))
2.0999999999999996
print(repr(1.4*1.5))
2.0999999999999996
Run Code Online (Sandbox Code Playgroud)

是否存在描述变更的PEP或负责人的其他声明?

python python-2.7 python-3.x floating-point-conversion

23
推荐指数
1
解决办法
1604
查看次数

浮点数和字符串转换的奇怪行为

我把它键入python shell:

>>> 0.1*0.1
0.010000000000000002
Run Code Online (Sandbox Code Playgroud)

我预计0.1*0.1不是0.01,因为我知道基数10中的0.1在基数2中是周期性的.

>>> len(str(0.1*0.1))
4
Run Code Online (Sandbox Code Playgroud)

因为我看过20个字符,所以我预计会得到20分.我为什么得到4?

>>> str(0.1*0.1)
'0.01'
Run Code Online (Sandbox Code Playgroud)

好吧,这解释了为什么我len给了我4,但为什么要str回来'0.01'

>>> repr(0.1*0.1)
'0.010000000000000002'
Run Code Online (Sandbox Code Playgroud)

为什么str圆而repr不是?(我已经阅读了这个答案,但我想知道他们如何决定何时str轮流浮动而不是什么时候)

>>> str(0.01) == str(0.0100000000001)
False
>>> str(0.01) == str(0.01000000000001)
True
Run Code Online (Sandbox Code Playgroud)

所以它似乎是浮子准确性的问题.我以为Python会使用IEEE 754单精度浮点数.所以我这样检查过:

#include <stdint.h>
#include <stdio.h> // printf

union myUnion {
    uint32_t i; // unsigned integer 32-bit type (on every machine)
    float f;    // a type you want to play with
};

int main() {
    union myUnion testVar; …
Run Code Online (Sandbox Code Playgroud)

python floating-point python-2.x

18
推荐指数
2
解决办法
2639
查看次数