🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# Python 数字,类型转换和数学 > 原文: [https://www.programiz.com/python-programming/numbers](https://www.programiz.com/python-programming/numbers) #### 在本文中,您将了解 Python 中使用的不同数字,如何从一种数据类型转换为另一种数据类型以及 Python 支持的数学运算。 ## Python 中的数字数据类型 Python 支持整数,浮点数和复数。 在 Python 中,它们被定义为`int`,`float`和`complex`类。 整数和浮点由存在或不存在小数点分隔。 例如,5 是整数,而 5.0 是浮点数。 复数以`x + yj`的形式编写,其中`x`是实数部分,`y`是虚数部分。 我们可以使用`type()`函数来了解变量或值属于哪个类,并且可以使用`isinstance()`函数检查其是否属于特定类。 让我们看一个例子: ```py a = 5 print(type(a)) print(type(5.0)) c = 5 + 3j print(c + 3) print(isinstance(c, complex)) ``` 当我们运行上面的程序时,我们得到以下输出: ```py <class 'int'> <class 'float'> (8+3j) True ``` 尽管整数可以是任意长度,但浮点数最多只能精确到 15 个小数位(第 16 位不准确)。 我们每天处理的数字是十进制(以 10 为底)的数字系统。 但是计算机程序员(通常是嵌入式程序员)需要使用二进制(基数 2),十六进制(基数 16)和八进制(基数 8)数字系统。 在 Python 中,我们可以通过在数字之前添加前缀来表示这些数字。 下表列出了这些前缀。 | 数字系统 | 字首 | | --- | --- | | 二进制 | `'0b'`或`'0B'` | | 八进制 | `'0o'`或`'0O'` | | 十六进制 | `'0x'`或`'0X'` | 这里有些例子 ```py # Output: 107 print(0b1101011) # Output: 253 (251 + 2) print(0xFB + 0b10) # Output: 13 print(0o15) ``` 运行该程序时,输出为: ```py 107 253 13 ``` * * * ## 类型转换 我们可以将一种数字转换为另一种数字。 这也称为强制。 如果操作数之一为浮点型,则加法,减法等操作会强制整数隐式(自动)浮动。 ```py >>> 1 + 2.0 3.0 ``` 我们可以在上面看到 1(整数)被强制转换为 1.0(浮点数)以进行加法,结果也是一个浮点数。 我们还可以使用`int()`,`float()`和`complex()`之类的内置函数在类型之间进行显式转换。 这些函数甚至可以从[字符串](/python-programming/string)转换。 ```py >>> int(2.3) 2 >>> int(-2.8) -2 >>> float(5) 5.0 >>> complex('3+5j') (3+5j) ``` 从`float`转换为整数时,该数字将被截断(删除小数部分)。 * * * ## Python 十进制 Python 内置类`float`会执行一些可能令我们惊讶的计算。 我们都知道 1.1 和 2.2 的总和是 3.3,但是 Python 似乎不同意。 ```py >>> (1.1 + 2.2) == 3.3 False ``` 到底是怎么回事? 事实证明,浮点数在计算机硬件中以二进制分数形式实现,因为计算机只能理解二进制(0 和 1)。 由于这个原因,我们知道的大多数十进制小数不能准确地存储在我们的计算机中。 让我们举个例子。 我们不能将分数 1/3 表示为十进制数。 这将给出 0.33333333... 无限长,我们只能对其进行近似。 事实证明,十进制小数 0.1 会导致无限长的二进制分数 0.000110011001100110011...,而我们的计算机仅存储了有限数量的二进制数。 这只会接近 0.1,但永远不会相等。 因此,这是我们计算机硬件的局限性,而不是 Python 中的错误。 ```py >>> 1.1 + 2.2 3.3000000000000003 ``` 为了克服这个问题,我们可以使用 Python 随附的十进制模块。 浮点数的精度最高可以达到 15 个小数位,而十进制模块则具有用户可设置的精度。 让我们看一下区别: ```py import decimal print(0.1) print(decimal.Decimal(0.1)) ``` **输出** ```py 0.1 0.1000000000000000055511151231257827021181583404541015625 ``` 当我们要进行学校学习的十进制计算时,使用此模块。 它也保留了意义。 我们知道 25.50 公斤比 25.5 公斤更准确,因为它比两位小数两位。 ```py from decimal import Decimal as D print(D('1.1') + D('2.2')) print(D('1.2') * D('2.50')) ``` **输出**: ```py 3.3 3.000 ``` 注意上例中的尾随零。 我们可能会问,为什么不每次都执行`Decimal`而不是`float`? 主要原因是效率。 浮点运算必须比`Decimal`运算更快。 ### 何时使用十进制代替浮点数? 在以下情况下,我们通常使用十进制。 * 当我们编程需要精确表示十进制的金融应用时。 * 当我们要控制所需的精度水平时。 * 当我们想实现有效小数位的概念时。 * * * ## Python 分数 Python 通过其`fractions`模块提供了涉及小数的运算。 小数具有分子和分母,它们都是整数。 该模块支持有理数算法。 我们可以通过多种方式创建`Fraction`对象。 让我们看看它们。 ```py import fractions print(fractions.Fraction(1.5)) print(fractions.Fraction(5)) print(fractions.Fraction(1,3)) ``` **输出**: ```py 3/2 5 1/3 ``` 从`float`创建`Fraction`时,我们可能会得到一些异常的结果。 这是由于上一节中讨论的二进制浮点数表示不完善所致。 幸运的是,`Fraction`也允许我们使用字符串实例化。 使用十进制数字时,这是首选选项。 ```py import fractions # As float # Output: 2476979795053773/2251799813685248 print(fractions.Fraction(1.1)) # As string # Output: 11/10 print(fractions.Fraction('1.1')) ``` **输出**: ```py 2476979795053773/2251799813685248 11/10 ``` 此数据类型支持所有基本操作。 这里有一些例子。 ```py from fractions import Fraction as F print(F(1, 3) + F(1, 3)) print(1 / F(5, 6)) print(F(-3, 10) > 0) print(F(-3, 10) < 0) ``` **输出**: ```py 2/3 6/5 False True ``` * * * ## Python 数学 Python 提供`math`和`random`之类的模块来执行不同的数学运算,例如三角函数,对数,概率和统计等。 ```py import math print(math.pi) print(math.cos(math.pi)) print(math.exp(10)) print(math.log10(1000)) print(math.sinh(1)) print(math.factorial(6)) ``` **输出**: ```py 3.141592653589793 -1.0 22026.465794806718 3.0 1.1752011936438014 720 ``` 这是 [Python 数学模块](/python-programming/modules/math)中可用的函数和属性的完整列表。 ```py import random print(random.randrange(10, 20)) x = ['a', 'b', 'c', 'd', 'e'] # Get random choice print(random.choice(x)) # Shuffle x random.shuffle(x) # Print the shuffled x print(x) # Print random element print(random.random()) ``` 运行上面的程序时,输出如下(由于随机行为,值可能会有所不同) ```py 18 e ['c', 'e', 'd', 'b', 'a'] 0.5682821194654443 ``` 这是 [Python `random`模块](/python-programming/modules/random)中可用的函数和属性的完整列表。