# 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)中可用的函数和属性的完整列表。