如何强制除法成为浮点?除法一直舍入到0?

2024-04-26 13:35:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我有两个整数值ab,但我需要它们的浮点比率。我知道a < b我想计算a / b,所以如果我使用整数除法,我总是得到0和a的余数。

如何在下面的Python中强制c成为浮点数?

c = a / b

Tags: 整数比率浮点浮点数
3条回答

可以通过执行c = a / float(b)将其转换为float。如果分子或分母是浮点数,则结果也是。


注意:正如注释者所指出的,如果b可能不是整数或浮点数(或表示整数或浮点数的字符串),那么这将不起作用。如果您可能正在处理其他类型(如复数),则需要检查这些类型或使用其他方法。

How can I force division to be floating point in Python?

I have two integer values a and b, but I need their ratio in floating point. I know that a < b and I want to calculate a/b, so if I use integer division I'll always get 0 with a remainder of a.

How can I force c to be a floating point number in Python in the following?

c = a / b

这里真正要问的是:

“如何强制真除法,以便a / b返回小数?”

升级至Python 3

在Python 3中,要获得真正的除法,只需执行a / b

>>> 1/2
0.5

整数的经典除法行为Floor division现在是a // b

>>> 1//2
0
>>> 1//2.0
0.0

但是,您可能无法使用Python2,或者您可能正在编写必须同时在2和3中工作的代码。

如果使用Python 2

在Python 2中,它并不是那么简单。一些处理经典Python 2分区的方法比其他方法更好、更健壮。

Python 2的建议

您可以在任何给定模块中获得Python 3除法行为,顶部有以下导入:

from __future__ import division

然后对整个模块应用Python 3样式划分。它还可以在任意给定点的python shell中工作。在Python 2中:

>>> from __future__ import division
>>> 1/2
0.5
>>> 1//2
0
>>> 1//2.0
0.0

这确实是最好的解决方案,因为它可以确保模块中的代码与Python 3更向前兼容。

Python 2的其他选项

如果您不想将此应用于整个模块,则只能使用一些解决方法。最常用的方法是将其中一个操作数强制为浮点。一个可靠的解决方案是a / (b * 1.0)。在一个新的Python外壳中:

>>> 1/(2 * 1.0)
0.5

同样健壮的还有来自operator模块operator.truediv(a, b)truediv,但这可能会慢一些,因为它是一个函数调用:

>>> from operator import truediv
>>> truediv(1, 2)
0.5

不推荐用于Python 2

常见的是a / float(b)。如果b是一个复数,这将引发TypeError。因为定义了复数除法,所以当给除数传递复数时,不让除法失败对我来说是有意义的。

>>> 1 / float(2)
0.5
>>> 1 / float(2j)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: can't convert complex to float

故意让你的代码更脆弱对我来说没有多大意义。

您还可以使用-Qnew标志运行Python,但这有一个缺点,即使用新的Python 3行为执行所有模块,并且您的一些模块可能需要典型的除法,所以除了测试之外,我不建议这样做。但为了证明:

$ python -Qnew -c 'print 1/2'
0.5
$ python -Qnew -c 'print 1/2j'
-0.5j

在Python 2中,两个int的除法产生一个int。在Python 3中,它产生一个float。我们可以通过从__future__导入来获得新的行为。

>>> from __future__ import division
>>> a = 4
>>> b = 6
>>> c = a / b
>>> c
0.66666666666666663

相关问题 更多 >