为什么除法四舍五入为整数?[复制]

Why does the division get rounded to an integer? [duplicate]

提问人:Adam Nelson 提问时间:6/2/2010 最后编辑:mkrieger1Adam Nelson 更新时间:3/18/2022 访问量:437901

问:

我试图将一组从 -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。在我看来,这并不透明,但我想就是这样。

解释是什么?

数学 python-2.x

评论

1赞 miku 6/2/2010
Смотритетакже: 为什么这个划分在 python 中不起作用?
3赞 President James K. Polk 6/3/2010
亚当,我还是不喜欢你的解释。第一个示例是整数除法,它只返回 0。第二个示例被错误地括在括号中,以表示您想要的效果。
0赞 Adam Nelson 6/3/2010
@GregS 第一个例子是问题。第二个例子是解释性的,写在第一个问题之后。下面的所有答案都很好地解释了这个问题,尤其是@KennyTM。需要注意的是,我最初的问题只是 Python 2.x 上的问题,而不是 3 上的问题。行为会像这样改变有点令人不安,但现在我知道了,我将使用将来的导入划分并使用 3.x 行为。干杯。
1赞 tzot 6/28/2010
亚当,请更正你上次的编辑。右边没什么特别的;为了使除法为浮点数,分子或分母(或两者)都需要为浮点数。如果你认为你在文档中读到右边需要浮动,那么要么文档措辞不当,应该纠正,要么你误解了它。你有没有看到一个例子,然后从中推断出一个规则?
0赞 Karl Knechtel 6/12/2022
“浮点除法也不起作用:”这个例子不是“浮点除法”,这就是问题所在。 在这里调用,每当调用某些东西时,参数都会在调用之前进行评估。 只能看到一个整数,而不能推断出任何关于产生整数的计算。floatfloat

答:

11赞 A. Levy 6/2/2010 #1

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

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

评论

4赞 Fred Larson 6/2/2010
@Adam Nelson:对我来说工作正常。检查括号。
0赞 Adam Nelson 6/2/2010
实际上,我错了 - 但是在查看了文档之后,应该先投右边。
11赞 kennytm 6/2/2010
@Adam:哪一方先走并不重要。
0赞 Fred Larson 6/2/2010 #2

无论哪种方式,它都是整数除法。10/90 = 0。在第二种情况下,您只是将 0 转换为浮点数。

尝试将“/”的操作数之一转换为浮点数:

float(20-10) / (100-10)
0赞 David M 6/2/2010 #3

在第二个示例中,在除法已经发生之后,您正在强制转换为浮动。试试这个:

float(20-10) / float(100-10)
21赞 David Webb 6/2/2010 #4

把整数放进去,所以 Python 给你一个整数:

>>> 10 / 90
0

如果之后将其转换为浮点数,则舍入已经完成,换句话说,0 整数将始终变为 0 浮点数。

如果你在除法的任一侧使用浮点数,那么 Python 会给你你期望的答案。

>>> 10 / 90.0
0.1111111111111111

因此,就您而言:

>>> float(20-10) / (100-10)
0.1111111111111111
>>> (20-10) / float(100-10)
0.1111111111111111
247赞 kennytm 6/2/2010 #5

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

>>> 1 / 2
0

您应该将其中一个设为:float

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

或者,强制采用 Python 3.x 的行为,该行为总是返回浮点数。from __future__ import division/

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

评论

10赞 User 11/28/2013
如果使用,则可以通过使用两个斜杠(例如 将导致 0)。参见 Pep 238 更改除法运算符from __future__ import division1 // 2
1赞 Janosh 10/28/2018
@User 无需从 导入。在 Python 中,2 和 3 都默认引用。__future__//__floordiv__()
0赞 wjandrea 1/20/2022
@Casimir 他们说,如果你需要楼层划分,它是可用的。你不会被这种行为所困。__future__.division
2赞 unbeli 6/2/2010 #6

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

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

将结果转换为浮动为时已晚。

4赞 billmanH 8/23/2014 #7

通过在数字后放置“.”来指定浮点数也会导致其默认为浮点数。

>>> 1 / 2
0

>>> 1. / 2.
0.5
8赞 George 11/21/2014 #8

它与您使用的 python 版本有关。基本上它采用 C 行为:如果将两个整数相除,结果将向下舍入为整数。还要记住,Python 从左到右执行操作,这在您打字时会发挥作用。

例: 由于这是我在进行算术运算时总是出现在我脑海中的问题(我应该转换为浮点数以及哪个数字),因此提供了这方面的一个例子:

>>> 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

最后,当我们将第一个整数键入为浮点数时,结果是所需的,因为从第一个除法开始,即最左边的整数,我们使用浮点数。

额外 1:如果您想回答这个问题以改进算术评估,您应该检查内容

额外 2:请注意以下情况:

>>> a = float(1/2/3/4/5/4/3)
>>> a
0.0
13赞 hackwithharsha 8/2/2015 #9

在 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

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

运算符是 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,只是因为是浮点除法。/

0赞 kcrisman 2/22/2017 #10

我有点惊讶,没有人提到原来的发帖人可能喜欢有理数的结果。如果您对此感兴趣,基于 Python 的程序 Sage 会为您提供支持。(目前仍基于 Python 2.x,但 3.x 正在进行中。

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

这不是适合所有人的解决方案,因为它确实做了一些准备,所以这些数字不是 s,而是 Sage 类元素。尽管如此,值得一提的是,作为 Python 生态系统的一部分。intInteger

0赞 FredWe 10/8/2017 #11

就我个人而言,我更喜欢在一开始就插入一个。所以表达式变成这样:1. *

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

正如我总是对一些公式进行除法一样:

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

所以不可能简单地添加一个喜欢.就我而言,用 a 包装可能会失去一点可读性。.020.0float()

1赞 Kavitha Raj 6/30/2018 #12

在 python 中没有更新除法计算。因此,您必须包含在程序的第一行。cv2from __future__ import division

0赞 Zgpeace 3/18/2022 #13

在 Python 3 中,“//”运算符用作整数和浮点参数的楼层划分。但是,如果其中一个参数是浮点数,运算符 / 将返回浮点值(这类似于 C++)

例如:

# 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/