Python Dictionary Floats

lig*_*nic 1 python floating-point dictionary

我在Python(2.6.1)词典中遇到了一个奇怪的行为:

我的代码是:

new_item = {'val': 1.4}
print new_item['val']
print new_item
Run Code Online (Sandbox Code Playgroud)

结果是:

1.4
{'val': 1.3999999999999999}
Run Code Online (Sandbox Code Playgroud)

为什么是这样?它发生在一些数字上,但不是其他数字.例如:

  • 0.1变为0.1000 ... 001
  • 0.4变为0.4000 ... 002
  • 0.7变为0.6999 ... 996
  • 1.9变为1.8888 ... 889

Mic*_*rdt 8

这不是特定于Python的,每个使用二进制浮点的语言(这几乎是每种主流语言)都会出现问题.

浮点指南:

因为在内部,计算机使用的格式(二进制浮点)无法准确地表示0.1,0.2或0.3之类的数字.

编译或解释代码时,"0.1"已经四舍五入到该格式中最接近的数字,即使在计算发生之前也会导致小的舍入误差.

某些值可以精确地表示为二进制分数,并且输出格式化例程通常会显示更接近实际值的最短数字,而不是任何其他浮点数,这会掩盖一些舍入错误.