充分利用小数的数字

Python 中浮点数的奥秘

在Python编程中,浮点数 (float) 是一种基本的数据类型,用于表示带有小数位的数值。 它们可以是正数或负数,并包含科学计数法表示形式,其中“e”或“E”代表10的幂。

浮点数之所以至关重要,是因为它们能够精确表示各种实数,涵盖了从极小到极大的数值范围。

以下是一些Python中浮点数的示例:

# 浮点数示例
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 中的整数与浮点数之比较

整数 (int) 是Python中另一种常用的数据类型,与浮点数不同的是,整数不包含小数部分。 整数可以是正数、负数或零。

当我们需要执行计数或索引等操作时,整数便非常有用。在Python中,整数以 `int` 类型表示。

以下是一些整数的示例:

a = 0
b = 968
c = -14

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

输出结果:

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

整数和浮点数之间的一些关键区别如下:

特征 整数 (int) 浮点数 (float)
表示 不带小数点的整数、负数和零。 带小数点的实数。
精度 无限精度,整数值的长度和大小仅受系统可用内存的限制。 有限精度。 最大可存储的浮点数约为 1.8 x 10308
内存使用 使用的内存比浮点数少。 使用的内存比整数多。
位运算 广泛用于按位运算。 几乎不用作按位运算。
用途 常用于计数、索引和按位运算。 广泛用于测量、科学计算和大多数数学运算。

在 Python 中创建和使用浮点数的多种方法

在 Python 中使用浮点数最简单的方法是直接给变量赋值一个浮点数值,如下所示:

# 为变量赋值一个浮点数值
a = 3.142

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

number1 = 2524
numString1 = "513.523"
numString2 = "1341"
# 转换为浮点数并将其存储在变量中
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("整数除法结果:")
print(int(20/3))
print("浮点数除法结果:")
print(result)
print(type(result))

输出结果:

整数除法结果:
6
浮点数除法结果:
6.666666666666667
<class 'float'>

在上述示例中,请注意浮点数可以提供更为精确的除法结果,而不是像整数除法那样直接返回整数部分。

在Python中处理浮点数时,由于浮点数在计算机内部的表示方式,你可能会遇到一些意想不到的情况。 浮点数在计算机硬件中以二进制(基数为2)小数的形式表示。

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

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

num = 0.3
print("显示 20 位有效数字:")
print(format(num, '.20f'))
print("变量num 的存储值:")
print(num)

输出结果:

显示 20 位有效数字:
0.29999999999999998890
变量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("总和是否等于预期值:")
print(sum == answer)
print("总和的内部表示:")
print(sum)
print("手动计算得出的结果是:")
print(answer)

输出结果:

总和是否等于预期值:
False
总和的内部表示:
0.8999999999999999
手动计算得出的结果是:
0.9

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

因此,在比较浮点数时,你可能需要首先将它们四舍五入到相同的有效位数。 为了在 Python 中处理浮点数时获得更高的精度,请考虑使用内置的 `decimal` 模块。

Python 中的 `decimal` 模块

在高精度至关重要且是必要条件的情况下,例如在金融和科学计算中,使用浮点数可能不是最佳选择。为了保证处理浮点数时的高精度,我们应该使用 Python 内置的 `decimal` 模块。

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

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

要开始使用 `decimal` 模块,请将其导入到你的 Python 文件中,如下所示:

import decimal

为了理解 `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("总和是否等于预期值:")
print(sum == answer)
print("总和的内部表示:")
print(sum)
print("手动计算得出的结果是:")
print(answer)

输出结果:

总和是否等于预期值:
True
总和的内部表示:
0.9
手动计算得出的结果是:
0.9

因此,当使用浮点数且需要高精度时,请务必记住始终使用 `decimal` 模块。

使用浮点数时常见的错误

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

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

由于舍入错误等问题,当你尝试在浮点数值之间进行相等比较时,可能会遇到错误。在 Python 中使用浮点数时,请务必格外小心,并注意那些意想不到的结果。

避免使用浮点数可能出现的所有错误的更好方法是使用内置的 `decimal` 模块。 这样,浮点数计算的结果将更具可预测性和准确性。

结论

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

如果你的应用程序需要精确的结果,请避免使用浮点数值。 相反,请使用内置的 `decimal` 模块,它会生成准确的浮点数结果,并以与机器无关的方式精确地表示它们。

你还可以阅读 Python 的迭代器函数和 Python 的 try except 语句。