【问题标题】:Python calculations: floats and ints [duplicate]Python计算:浮点数和整数[重复]
【发布时间】:2013-05-16 00:38:26
【问题描述】:

在 600 行的长代码中,我有一部分代码会计算一些奇怪的东西。

idl = 0
print type(dl), dl
idl = int(dl*10)+1
print idl

这会返回:

<type 'float'> 0.1
1

这个计算是在我的代码的定义中完成的。 这显然不是预期的结果。奇怪的是,当我将上面的代码复制到一个单独的 python 文件中时:

idl = 0
dl = 0.1
print type(dl), dl
idl = int(dl*10)+1
print idl

我明白了:

<type 'float'> 0.1
2

这个问题的根源可能是什么?我已经提取了这些部分,以使问题变得简单,但是如果您愿意,我可以提供更多信息。

【问题讨论】:

  • 转换为 int 不会四舍五入您的数字,而是截断它。因此,您可以获得 0.999999 而不是 1,因此当转换为 int 时它给出 0。我不确定为什么不同地方的结果会有所不同......
  • 也许dl 的值不像第一种情况那样接近 .1,但 Python 仅以有限的精度打印它。我建议您更精确地打印它(我不熟悉这样做的 Python 语法)或打印 dl-.1 以查看差异。正如 sashkello 所指出的,如果 dl 略小于 .1,则 dl*10 略小于 1,转换为 int 会将其截断为零。

标签: python floating-point int


【解决方案1】:

Eric Postpischil 的评论很中肯。

Python 试图向普通用户隐藏浮点数的一些丑陋之处。大多数时候,这很好。有时,你会感到惊讶。许多十进制数不能精确地以二进制形式表示——它们变成重复的或极长的分数。 Python 的显示代码将二进制浮点数转换为十进制数,有时会四舍五入以到达正确的位置。

这是关于该主题的可靠参考:http://docs.python.org/2/tutorial/floatingpoint.html

您提供的代码 sn-p 是正确的,但您不妨使用int(round(dl*10))。

如果浮点数中十进制数学的不精确表示让您感到惊愕——例如,如果您使用金钱可能会出现这种情况——请查看十进制模块:http://docs.python.org/2/library/decimal.html#module-decimal

decimal 模块为进行十进制数学运算提供了极好的工具,但使用起来比浮点数更麻烦。

不管怎样,这个问题并不是 Python 独有的。您会在大多数编程语言中发现类似的问题(以及类似的十进制数学库来解决这些问题。)

【讨论】:

  • 谢谢你,这个答案真的帮助了我,事实上这正是问题所在。
猜你喜欢
  • 2018-03-22
  • 1970-01-01
  • 2012-09-12
  • 2017-07-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-28
  • 2020-11-30
相关资源
最近更新 更多