python 为什么我应该使用int而不是float?

mpbci0fu  于 2023-06-28  发布在  Python
关注(0)|答案(4)|浏览(207)

我正在准备一堂课(我正在教),我试图预测学生可能提出的任何问题,我遇到了一个我无法回答的问题:
如果我们有浮点数,为什么还要用整型数呢?这有什么意义
我知道(或者至少我认为)浮点数占用更多的内存,因为它们具有更高的准确性,但就大多数非嵌入式应用程序的内存使用而言,这种差异几乎可以忽略不计。
我意识到在很多情况下,我们实际上并不需要浮点数,但老实说,为什么我们首先要用int呢?这有什么意义没有什么是int能做的而float不能。
那他们到底为什么在那里?
编辑:你可能会说它们更容易写(3对3)。3.0),但你可以让所有数字默认为float,所以3将被视为与3.0相同。为什么要把它变成另一种类型?

idfiyjo8

idfiyjo81#

浮点数在许多情况下是近似值。一些整数(和小数)可以精确地用float表示,但大多数不能。参见Floating Point Arithmetic: Issues and Limitations

>>> a = 1000000000000000000000000000
>>> a+1 == a
False
>>> a = 1000000000000000000000000000.0
>>> a+1 == a
True

由于浮点数的这种近似性质,一些计算可能会产生意想不到的结果(这与问题没有直接关系,但它很好地说明了这一点):

>>> sum(1.1 for _ in range(9))
9.899999999999999

例如,当您处理货币计算时,最好使用整数或(如果速度不是问题)decimal module

5t7ly7z5

5t7ly7z52#

使用最适合其所用于的任务的数据类型非常重要。一个数据类型可能不适合不同的方式。例如,单个字节不适合用于人口计数,因为您不能计数超过255个个体。另一方面,浮点数是不合适的,因为许多可能的浮点值没有意义。例如,1.5是一个浮点值,作为计数没有任何意义。因此,使用适当大小的整数类型为我们提供了最佳选择。不需要执行健全性检查来清除无意义的值。
支持整数而不是浮点数的另一个原因是性能和效率。整数运算速度更快。对于给定的范围,整数占用的内存更少,因为整数不需要表示非整数值。
另一个原因是显示意图。当代码的读者看到您使用了一个整数时,该读者可以推断出该数量仅适用于整数值。

kjthegm6

kjthegm63#

有各种历史原因适用于大多数语言:

  • “不要使用你不需要的东西”的哲学许多程序不需要非整数值,但大量使用整数值,因此整数类型反映了问题域。
  • 浮点运算曾经比整数运算昂贵得多。它仍然有点昂贵,但在Python中的很多情况下,你几乎不会注意到差异。
  • 一个32位的IEEE浮点数只能表示2**24以下的所有整数,然后失去精度。16位浮点数(“半精度”)仅表示2048以内的所有整数。因此,对于16位和32位计算,当寄存器大小在性能和值范围之间施加严重的权衡时,float-for-everything使这种权衡变得更加严重。
  • 8位整数类型(或平台上存在的任何字节大小)对于低级编程非常有用,因为它精确地Map到内存中可表示的任何数据。对于寄存器大小的整数类型也是如此,它在字而不是字节中工作时具有一些效率优势。这些是C中的(有符号和无符号)charint类型。

还有一个特别针对Python的原因:

  • 当计算超出其范围时,int类型自动升级为long,从而保持精度。float不会为了保持精确而变大。这两种行为在不同的情况下都很有用。

请注意,JavaScript不提供整数类型。JavaScript中唯一的内置数字是64位浮点数。因此,无论为什么整数类型是有益的,考虑没有它的Javascript如何发展都是有启发性的。

e1xvtsh3

e1xvtsh34#

我目前能想到的原因有四个(我相信还有更多):
1.内存:明智地选择数据类型会极大地影响内存需求(例如,大型数据库)。
1.速度:整数运算的硬件实现比浮点运算快得多(也简单)。
1.方案拟订做法。拥有数据类型可以强制执行更好的编程实践,因为程序员必须知道每个变量存储的数据类型。这也允许早期错误检测(编译时vs运行时)。
1.历史:内存曾经很昂贵(对于某些应用程序来说,在某些系统上仍然是如此)。

相关问题