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

2024-11-26 08:37:00
admin
原创
196
摘要:问题描述:我试图将一组从 -100 到 0 的数字规范化到 10 到 100 的范围,但遇到了问题,结果发现即使没有任何变量,这也不会按照我期望的方式进行评估:>>> (20-10) / (100-10) 0 浮点除法也不起作用:>>> float((20-10) / (1...

问题描述:

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

怎么解释呢?


解决方案 1:

您正在使用 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

解决方案 2:

你输入了整数,因此 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

解决方案 3:

在 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,只是因为/它是一个浮点除法。

解决方案 4:

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

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

解决方案 5:

这与您使用的 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

解决方案 6:

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

>>> 1 / 2
0

>>> 1. / 2.
0.5

解决方案 7:

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

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

将结果转换为浮点数已经太晚了。

解决方案 8:

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

解决方案 9:

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

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

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

解决方案 10:

在第二个示例中,您在除法已经发生之后才转换为浮点型。尝试以下操作:

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

解决方案 11:

我有点惊讶,竟然没有人提到原始发帖者可能喜欢有理数的结果。如果您对此感兴趣,那么基于 Python 的程序Sage 可以为您提供支持。(目前仍基于 Python 2.x,尽管 3.x 正在开发中。)

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

这不是适合所有人的解决方案,因为它确实进行了一些预解析,因此这些数字不是ints,而是 SageInteger类元素。不过,作为 Python 生态系统的一部分,还是值得一提的。

解决方案 12:

我个人更喜欢在最开始处插入一个1. *。因此表达式变成如下形式:

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

我总是对某些公式进行除法,例如:

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

因此无法简单地添加一个.0like 20.0。而就我而言,用 包裹float()可能会失去一点可读性。

解决方案 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/

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   2500  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1541  
  PLM(产品生命周期管理)项目对于企业优化产品研发流程、提升产品质量以及增强市场竞争力具有至关重要的意义。然而,在项目推进过程中,范围蔓延是一个常见且棘手的问题,它可能导致项目进度延迟、成本超支以及质量下降等一系列不良后果。因此,有效避免PLM项目范围蔓延成为项目成功的关键因素之一。以下将详细阐述三大管控策略,助力企业...
plm系统   16  
  PLM(产品生命周期管理)项目管理在企业产品研发与管理过程中扮演着至关重要的角色。随着市场竞争的加剧和产品复杂度的提升,PLM项目面临着诸多风险。准确量化风险优先级并采取有效措施应对,是确保项目成功的关键。五维评估矩阵作为一种有效的风险评估工具,能帮助项目管理者全面、系统地评估风险,为决策提供有力支持。五维评估矩阵概述...
免费plm软件   23  
  引言PLM(产品生命周期管理)开发流程对于企业产品的全生命周期管控至关重要。它涵盖了从产品概念设计到退役的各个阶段,直接影响着产品质量、开发周期以及企业的市场竞争力。在当今快速发展的科技环境下,客户对产品质量的要求日益提高,市场竞争也愈发激烈,这就使得优化PLM开发流程成为企业的必然选择。缺陷管理工具和六西格玛方法作为...
plm产品全生命周期管理   26  
热门文章
项目管理软件有哪些?
曾咪二维码

扫码咨询,免费领取项目管理大礼包!

云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用