我为什么要用int而不是浮点数?

tem*_*ame 5 python floating-point int python-3.x

我正准备上课(我正在教学),我正在努力预测学生们可能提出的任何问题,而且我遇到了一个我无法回答的问题:

如果我们有浮标,我们为什么要使用整数?重点是什么?

我知道(或者至少我认为)浮点数会占用更多内存,因为它们具有更高的准确性,但就大多数非嵌入式应用程序的内存使用情况而言,差异几乎可以忽略不计.

我意识到在很多情况下,我们其实并不需要一个浮动,但说实话,为什么我们首先整数?重点是什么?没有一个int可以做浮动不能做的事情.

那他们为什么一个人呢?

编辑:你可以说他们更容易写(3对3.0),但你可以让所有数字默认为浮动,所以3将被视为3.0.为什么要把它变成另一种类型?

Tim*_*ker 10

在许多情况下,浮点数是近似值.一些整数(和小数)可以用a精确表示float,但大多数不能.请参阅浮点算术:问题和限制.

>>> a = 1000000000000000000000000000
>>> a+1 == a
False
>>> a = 1000000000000000000000000000.0
>>> a+1 == a
True
Run Code Online (Sandbox Code Playgroud)

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

>>> sum(1.1 for _ in range(9))
9.899999999999999
Run Code Online (Sandbox Code Playgroud)

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

  • 你的第一个论点归结为"数学值1.1不能表示为浮点数".考虑到1.1不能表示为整数,我不明白这是一个"一个int可以做浮动不能"的例子. (10认同)
  • 我把问题称为"为什么不将整数存储在浮点对象中?",但1.1不是整数. (3认同)
  • “当你处理金钱计算时,最好使用整数。”:这是一个恼人的模因。double 在许多“金钱计算”中表现得很好,并且额外的硬件支持使它们比现代机器上的等效定点计算快得多。缺点是,如果你想让浮点代码正常工作,你在编写浮点代码时通常必须保持清醒。 (2认同)

Dav*_*nan 8

使用最适合其所用任务的数据类型非常重要.数据类型可能不适合不同的方式.例如,单个字节不适合人口计数,因为您不能超过255个人.另一方面,浮点数不合适,因为许多可能的浮点值没有意义.例如,1.5是一个浮点值,没有任何意义作为计数.因此,使用适当大小的整数类型可以使我们最合适.无需进行健全性检查以消除无意义的价值观.

支持整数优于浮点数的另一个原因是性能和效率.整数算术更快.对于给定的范围,整数消耗的内存较少,因为整数不需要表示非整数值.

另一个原因是显示意图.当代码的读者看到您使用了整数时,该读者可以推断数量仅用于获取整数值.


Ste*_*sop 7

适用于大多数语言的历史原因有很多:

  • "不要使用你不需要的东西"的哲学.许多程序不需要非整数值但是使用整数值,因此整数类型反映了问题域.

  • 浮点运算比整数要贵得多.它仍然有点贵,但在Python的很多情况下,你几乎没有注意到差异.

  • 32位IEEE浮点数只能表示所有整数,2**24然后才会失去精度.16位浮点数("半精度")仅表示2048的所有整数.因此,对于16位和32位计算,当寄存器大小在性能和值范围之间进行严格的权衡时,浮动对于一切都需要权衡更严重的是.

  • 8位整数类型(或平台上存在的任何字节大小)对于低级编程非常有用,因为它完全映射到内存中可表示的任何数据.对于寄存器大小的整数类型也是如此,在单词而不是字节中工作具有一定的效率优势.这些是(有符号和无符号)charintC中的类型.

Python专门有一个额外的原因:

  • int类型自动提升到long当计算超出其范围,从而保持精度.float不会变得更大以保持精确.这两种行为在不同情况下都很有用.

请注意,Javascript不提供整数类型.Javascript中唯一的内置数字是64位浮点数.因此,出于任何理由,为什么整数类型是有益的,考虑Javascript如何在没有它的情况下开启是有益的.