充分利用小数的数字

Python 中最常用的数据类型之一是 float,它表示浮点数。 浮点数是具有小数位的正数或负数。 浮点数还包括使用科学记数法表示的数字,其中字符 e 或 E 用于表示 10 的幂。

浮点型是一种非常重要的数据类型,因为它可以表示各种实数,从非常小的数字到非常大的数字。

Python中浮点数的例子如下所示:

# float numbers
a = 20.0
b = -51.51345
c = 65e7
d = -1.08E12
e = 2E10

print(type(a))
print(type(b))
print(type(c))
print(type(d))
print(type(e))

输出:

<class 'float'>
<class 'float'>
<class 'float'>
<class 'float'>
<class 'float'>

此外,与整数等数据类型相比,它们可以进行更准确的计算,整数删除了数字的小数部分。 例如,对于整数,诸如 3.142 之类的数字将简单地表示为 3。

但是,浮点数据类型将按原样表示实际数字,即 3.142。 因此,浮点值更适合数学计算,因为它们产生更准确的结果。

在这方面,浮点值广泛应用于现实世界建模、机器学习、数据科学、金融和经济分析、数学计算、图形和可视化以及科学和工程计算。

Python 中的整数与浮点数

整数是 Python 中另一种非常流行的数据类型。 与浮点数不同,整数没有小数点。 整数由正整数、负数和零组成,所有这些都没有小数部分。

当我们执行涉及整数的运算时(例如计数或索引时),整数非常有用。 在 Python 中,整数值表示为 int。

一些整数如下所示:

a = 0
b = 968
c = -14

print(type(a))
print(type(b))
print(type(c))

输出:

<class 'int'>
<class 'int'>
<class 'int'>

Python 中整数和浮点数之间的一些区别包括:

特征整数(int)浮点数(float)表示整数、其负数和零,均不带小数点。带小数点的实数精度无限精度,因此 int 值的长度和大小没有限制。 唯一的限制是系统中的可用内存。精度有限。 您可以存储的最大浮点值约为 1.8 x 10308 内存使用 使用的内存比浮点数少 使用比整数值更多的内存 位运算 广泛用于按位运算 几乎从不用于按位运算 用途 通常用于计数、索引和按位运算 广泛用于测量、科学计算和大多数数学运算

在 Python 中创建和使用浮点数的不同方法

在 Python 中开始使用浮点值的一个简单方法是为变量分配一个浮点值,如下所示:

# assign a variable a float value
a = 3.142

获取浮点值的另一种方法是使用 float() 构造函数将整数和数字字符串转换为浮点值。 如果我们将整数或数字字符串传递给 float(),它将被转换为浮点值,如下所示:

number1 = 2524
numString1 = "513.523"
numString2 = "1341"
# Convert to a float and store the float value in a variable
a = float(number1)
print(a)
b = float(numString1);
print(b)
c = float(numString2)
print(c)

输出:

2524.0
513.523
1341.0

在上面的示例中,使用 float() 将整数和字符串转换为浮点值,然后存储在变量中,然后打印出来,显示转换后的浮点值。

获取浮点值的另一种方法是执行除法等数学计算,如下所示:

num1 = 20
num2 = 3
result = num1/num2
print("Result of the division as an integer:")
print(int(20/3))
print("Result of the division as a float value:")
print(result)
print(type(result))

输出:

Result of the division as an integer:
6
Result of the division as a float value:
6.666666666666667
<class 'float'>

在上面的示例中,请注意,与除法并将结果作为整数返回相比,浮点值为我们提供了更准确的答案。

在 Python 中处理浮点数时,由于浮点值在计算机内部的表示方式,您可能会遇到一些非常有趣的结果。 浮点数在计算机硬件中表示为基数 2(二进制)分数。

然而,大多数十进制分数,特别是那些具有循环小数的分数,不能表示为精确的二进制分数。 因此,浮点数通常存储为实际值的近似值。

要实际查看这一点,请考虑浮点值 0.3。 如果将 0.3 分配给变量,在内部,它不会精确地存储为 0.3。 为了了解这一点,我们可以使用 format() 函数来查看 0.3 的内部表示方式。 format() 允许我们显示我们正在使用的值的所需数量的有效数字。 在下面的示例中,我们打印出 0.3 到 20 位有效数字,以了解其内部存储方式。

num = 0.3
print("num to 20 significant figures")
print(format(num, '.20f'))
print("Value we stored for num")
print(num)

输出:

num to 20 significant figures
0.29999999999999998890
Value we stored for num
0.3

正如您所看到的,我们分配给名为 num 的变量的值 0.3 在内部存储时并不精确为 0.3。 当您打印变量 num 时,您会得到一个四舍五入的值。

因此,在使用浮点值时可能会得到一些意想不到的结果。 例如,如果您要手动计算 0.3 + 0.3 + 0.3,则您的答案将为 0.9。 然而,根据 Python 的说法,情况并非如此,因为它在内部存储实际值的二进制分数近似值。 如下所示:

sum = 0.3 + 0.3 + 0.3
answer = 0.9
print("Is sum equal to answer: ")
print(sum == answer)
print("The internal representation of of sum is: ")
print(sum)
print("The answer from manual calculation is: ")
print(answer)

输出:

Is sum equal to answer: 
False
The internal representation of of sum is: 
0.8999999999999999
The answer from manual calculation is: 
0.9

因此,在使用浮点值时,请务必记住 Python 不会在内部存储精确值。 相反,它存储实际值的近似值。

因此,在比较浮点值时,您可能需要首先将四舍五入为相同数量的有效数字。 为了在 Python 中处理浮点数时获得更高的准确性,请考虑使用内置的十进制模块。

Python 中的十进制模块

在高精度很重要并且是必须具备的情况下,例如在金融和科学计算中,使用浮点数并不理想。 为了保证处理浮点数时的高精度,使用内置的 Python 模块decimal。

与存储为与机器相关的二进制浮点表示形式的 float 不同,decimal 模块使用与机器无关的基于十进制的表示形式存储浮点数,这提供了更高的精度。

此外,十进制模块能够准确地表示十进制数,并准确地在计算中使用它们。 它还提供正确舍入的十进制浮点运算。

要开始使用十进制模块,请将其导入到您的 Python 文件中,如下所示:

import decimal

为了了解十进制模块的好处,让我们重做之前 0.3 + 0.3 + 0.3 之和与值 0.9 之间的比较。 执行此操作的代码如下所示:

import decimal

sum = decimal.Decimal('0.3') + decimal.Decimal('0.3') + decimal.Decimal('0.3')
answer = decimal.Decimal('0.9')
print("Is sum equal to answer: ")
print(sum == answer)
print("The internal representation of sum is: ")
print(sum)
print("The answer from manual calculation is: ")
print(answer)

输出:

Is sum equal to answer: 
True
The internal representation of sum is: 
0.9
The answer from manual calculation is: 
0.9

因此,当使用浮点数并且需要高精度时,请记住始终使用十进制模块。

使用浮点数时的常见错误

在 Python 中使用 Float 时出现的许多错误都源于不理解 Python 内部如何表示浮点数。 例如,诸如 0.3 之类的值将不会完全存储为 0.3。 因此,如果您使用浮点值,假设它们完全按原样存储,则可能会遇到错误。

一种常见错误是对浮点值执行数学计算时会遇到的舍入错误。 由于 Python 无法表示实际的浮点值,因此您可能会遇到舍入错误,结果可能不是您所期望的。

由于舍入错误等错误,当您尝试在浮点值之间进行相等比较时,可能会遇到错误。 在 Python 中使用浮点数时要格外小心,并注意意外结果。

避免使用浮点值时可能出现的所有错误的更好方法是使用内置的十进制模块。 这样,浮点数计算的结果将更加可预测和准确。

结论

作为使用 Python 的程序员,您必然会使用 float 数据类型。 为了避免这种数据类型出现错误,了解 Python 内部如何表示浮点数非常重要。 由于 Python 无法存储实际的浮点数,因此请避免与浮点值进行精确相等的比较。 否则,你会遇到错误。

如果您的应用程序需要准确的结果,请避免使用浮点值。 相反,请使用内置的十进制模块,该模块会生成准确的浮点数结果,并以与机器无关的方式准确地按原样表示它们。

您还可以阅读 Python Itertools Functions 和 Python Try except。