【问题标题】:Why doesn't this division work in Python? [duplicate]为什么这个除法在 Python 中不起作用? [复制]
【发布时间】:2009-11-24 01:32:31
【问题描述】:

考虑:

>>> numerator = 29
>>> denom = 1009
>>> print str(float(numerator/denom))
0.0

如何让它返回小数?

【问题讨论】:

  • 有点旁白,但float 与Python 标准库中的Decimal 类型不同。当你说“我只是希望它返回一个小数”时,你真正的意思是“我只是希望它返回一个以十进制表示法表示小数值的字符串”,对吧?

标签: python numbers


【解决方案1】:

在版本 3 之前,Python 的除法运算符 / 在带有两个整数参数时的行为类似于 C 的除法运算符:它返回一个整数结果,当存在小数部分时会被截断。见:PEP 238

>>> n = 29
>>> d = 1009
>>> print str(float(n)/d)
0.0287413280476

在 Python 2(可能更早)中,您可以使用:

>>> from __future__ import division
>>> n/d
0.028741328047571853

【讨论】:

  • -7//3 = -3 (remainder is = 2) 在 Python 和 -7/3 = -2 (remainder = -1) 在 C/C++ 所以我不会说这种行为是在 Python 中与在 C/C++ 中相同
  • @Artur 这就是下限除法与标准除法以及模数与余数运算符之间的区别。 Floor 和 mod 趋向于负无穷,标准除法和余数趋向于零。
【解决方案2】:

在 Python 2.x 中,除法的工作方式与在类 C 语言中的工作方式类似:如果两个参数都是整数,则结果将被截断为整数,因此 29/1009 为 0。0 因为浮点数为 0.0。要修复它,请在除法之前转换为浮点数:

print str(float(numerator)/denominator)

在 Python 3.x 中,除法的作用更加自然,因此您将获得正确的数学结果(在浮点误差范围内)。

【讨论】:

    【解决方案3】:

    在您的评估中,您正在转换结果,您需要转换操作数。

    【讨论】:

      【解决方案4】:
      print str(float(numerator)/float(denom))
      

      【讨论】:

      • 将任一操作数转换为 float() 就足够了。我通常建议转换分子,因为它将转换定位在表达式的开头,读者通常会更容易看到它。
      • 是的,但这对我来说似乎更“合适”,因为它在铸造时更加透明。但是,是的,单独铸造一个就足够了。
      猜你喜欢
      • 2013-04-04
      • 1970-01-01
      • 2015-06-10
      • 1970-01-01
      • 1970-01-01
      • 2014-04-03
      • 2015-11-14
      • 1970-01-01
      • 2020-10-12
      相关资源
      最近更新 更多