为什么除法被四舍五入为一个整数?

我试图将一组从 -100到0的数字规范化到10到100的范围,但遇到的问题是,即使没有任何变量,它也不能按照我期望的方式进行计算:

>>> (20-10) / (100-10)
0

浮动分割也不起作用:

>>> float((20-10) / (100-10))
0.0

如果划分的任何一方被铸造成一个浮动,它将工作:

>>> (20-10) / float((100-10))
0.1111111111111111

第一个示例中的每一边都计算为一个 int,这意味着最终的答案将被强制转换为一个 int。因为0.111小于.5,所以四舍五入为0。在我看来,这并不透明,但我想事情就是这样。

解释是什么?

435279 次浏览

在进行除法之前,您需要将其更改为浮点数,即:

float(20 - 10) / (100 - 10)

不管怎样,都是整数除法。10/90 = 0.在第二种情况下,您只是将0转换为浮点数。

尝试将“/”的一个操作数转换为 float:

float(20-10) / (100-10)

在您的第二个示例中,在除法已经发生之后才进行浮动:

float(20-10) / float(100-10)

你是 把整数放进去,所以 Python 会返回一个整数:

>>> 10 / 90
0

如果之后将它转换成浮点数,四舍五入就已经完成了,换句话说,0整数总是变成0浮点数。

如果您在除法的任意一边使用 float,那么 Python 将给出您所期望的答案。

>>> 10 / 90.0
0.1111111111111111

所以对你来说:

>>> float(20-10) / (100-10)
0.1111111111111111
>>> (20-10) / float(100-10)
0.1111111111111111

您正在使用 Python 2.x,其中整数除法将被截断,而不是成为一个浮点数。

>>> 1 / 2
0

你应该把它们中的一个变成 float:

>>> float(10 - 20) / (100 - 10)
-0.1111111111111111

或者 from __future__ import division,它迫使 /采用 Python 3.x 的行为,这种行为总是返回一个浮点数。

>>> from __future__ import division
>>> (10 - 20) / (100 - 10)
-0.1111111111111111

让它们中的至少一个浮动,那么它将是浮动除法,而不是整数:

>>> (20.0-10) / (100-10)
0.1111111111111111

将结果铸造成浮子为时已晚。

通过在数字后面放置一个“ .”来指定一个 float 也会导致它默认为 float。

>>> 1 / 2
0


>>> 1. / 2.
0.5

它与您使用的 python 版本有关。基本上,它采用了 C 的行为: 如果你除以两个整数,结果将四舍五入到一个整数。还要记住,Python 从左到右执行操作,这在您进行类型转换时起着重要作用。

例如: 因为这个问题总是在我做算术运算时出现在我的脑海中(我是否应该转换成 float 和哪个数字) ,所以给出了一个这方面的例子:

>>> a = 1/2/3/4/5/4/3
>>> a
0

当我们除整数的时候,毫不奇怪它会变小。

>>> a = 1/2/3/4/5/4/float(3)
>>> a
0.0

如果我们对最后一个浮点数进行类型转换,我们仍然会得到零,因为当数字被浮点数除以时,由于整数除法,数字已经变成了0。

>>> a = 1/2/3/float(4)/5/4/3
>>> a
0.0

与上面的场景相同,但是将浮点类型转换得更靠左一些。

>>> a = float(1)/2/3/4/5/4/3
>>> a
0.0006944444444444445

最后,当我们将第一个整数类型化为 float 时,结果是所需的整数,因为从第一个除法开始,也就是最左边的除法,我们使用 float。

附加1: 如果你试图回答这个问题来改进算术评估,你应该检查 这个

附加2: 请注意以下情况:

>>> a = float(1/2/3/4/5/4/3)
>>> a
0.0

在 Python 2.7中,如果输入是整数,则 /运算符是整数除法:

>>>20/15
1


>>>20.0/15.0
1.33333333333


>>>20.0/15
1.33333333333

在 Python 3.3中,即使输入是整数,/操作符也是浮点除法。

>>> 20/15
1.33333333333


>>>20.0/15
1.33333333333

对于 Python3中的整数除法,我们将使用 //运算符。

在 Python 2.7和 Python 3.3中,//运算符都是整数除法运算符。

在 Python 2.7和 Python 3.3中:

>>>20//15
1

现在,看看这个比较

>>>a = 7.0/4.0
>>>b = 7/4
>>>print a == b

对于上面的程序,在 Python 2.7中输出为 False,在 Python 3.3中输出为 True。

在 Python 2.7中,a = 1.75,b = 1。

在 Python 3.3中,a = 1.75,b = 1.75,因为 /是浮点除法。

我有点惊讶,没有人提到原来的海报可能喜欢 理智数字的结果。如果您对此感兴趣,基于 Python 的程序 Sage 会支持你的。(目前仍基于 Python 2.x,不过3.x 正在开发中。)

sage: (20-10) / (100-10)
1/9

这不是每个人的解决方案,因为它确实做了一些准备,所以这些数字不是 int,而是 Sage Integer类元素。不过,作为 Python 生态系统的一部分,还是值得一提的。

就我个人而言,我更喜欢在开始的时候插入一个 1. *,所以这个表达式是这样的:

1. * (20-10) / (100-10)

正如我总是对一些公式做除法,比如:

accuracy = 1. * (len(y_val) - sum(y_val)) / len(y_val)

所以不可能简单地添加一个像 20.0这样的 .0。在我的情况下,用 float()包装可能会失去一点可读性。

在 pythoncv2中没有更新除法运算。因此,必须在程序的第一行包含 from __future__ import division

在 Python3中,“//”操作符作为整数和浮点参数的地板划分。但是,如果其中一个参数是 float (类似于 C + +) ,那么操作符/返回一个 float 值

例如:

# A Python program to demonstrate the use of
# "//" for integers
print (5//2)
print (-5//2)

产出:

2
-3






# A Python program to demonstrate use of
# "/" for floating point numbers
print (5.0/2)
print (-5.0/2)

产出:

2.5
-2.5

档号: https://www.geeksforgeeks.org/division-operator-in-python/