在Python中使用更多的小数

在Python中使用更多的小数,python,decimal,Python,Decimal,我已经有了一个代码,它使用二分法来确定某个东西的值,问题是我需要一个非常精确的值,超过15位小数,并且在某个时候python不再得到更小的数字 我知道小数库,但我真的必须将代码中的每个参数都重写为小数(参数)吗?因为我有很多参数 有没有一种方法可以将代码中的每个浮点数都转换成小数?或者有没有一种方法可以用另一种方法一起解决这个问题 62.5 31.25 15.625 23.4375 27.34375 25.390625 26.3671875 25.87890625 25.634765625 25

我已经有了一个代码,它使用二分法来确定某个东西的值,问题是我需要一个非常精确的值,超过15位小数,并且在某个时候python不再得到更小的数字

我知道小数库,但我真的必须将代码中的每个参数都重写为小数(参数)吗?因为我有很多参数

有没有一种方法可以将代码中的每个浮点数都转换成小数?或者有没有一种方法可以用另一种方法一起解决这个问题

62.5
31.25
15.625
23.4375
27.34375
25.390625
26.3671875
25.87890625
25.634765625
25.7568359375
25.81787109375
25.787353515625
25.7720947265625
25.76446533203125
25.760650634765625
25.758743286132812
25.75969696044922
25.759220123291016
25.758981704711914
25.758862495422363
25.758802890777588
25.758832693099976
25.75881779193878
25.75882524251938
25.75882151722908
25.75882337987423
25.758824311196804
25.75882477685809
25.758825009688735
25.758825126104057
25.758825184311718
25.758825155207887
25.758825140655972
25.758825133380014
25.758825137017993
25.758825138836983
25.758825139746477
25.758825140201225
25.75882513997385
25.758825139860164
25.75882513980332
25.7588251397749
25.75882513978911
25.758825139796215
25.758825139792663
25.758825139790886
25.758825139791774
25.75882513979222
25.758825139792442
25.75882513979233
25.758825139792386
25.758825139792414
25.7588251397924
25.758825139792407
25.758825139792403
25.758825139792407
25.758825139792407
25.758825139792407
25.758825139792407
25.758825139792407
25.758825139792407
25.758825139792407
您可以看到,在某个时刻Python停止更改值,因为它不计算较小的数字


感谢您

对于
float
实例,Python使用机器级双精度浮点数(
double
,用C表示)。这到底是什么取决于构建Python的平台和编译器。 这些天来,这很可能是一场灾难。53位有效位给出15到17位有效十进制数字

如果使用
numpy
,则可以使用
长双精度
浮点数。这是一个64位的sigificand,产生

Decimal
值的精度可调。默认情况下,它是28位有效数字,但您可以更改它。因此,如果您可以使用标准的数学运算符和
Decimal
支持的有限数量的数学函数,那么更改为Decimal可能是一个不错的选择。但这确实意味着更改所有代码。它是标准库的一部分,这可能是一个加号

或者,你可以看看图书馆。这还允许您设置任意精度(默认为15位有效数字)。它支持的高等数学远比
Decimal
多得多。它实现了
math
cmath
等所有函数。但在这里,您还必须将整个程序转换为将
float
更改为
mpf
类型。默认情况下,mpmath在内部处理整数。如果可用,mpmath将使用Python绑定到库,这使它的速度更快,尤其是在高精度(>100位)下

结论 如果您想要更高的精度,则必须将程序转换为使用任意精度的数学模块。根据您使用的
math
函数的数量,
mpmath
看起来更合适;它支持所有函数,包括
math
cmath
以及一些函数

如何转换 不可能从
float
mpf
(或
Decimal
)类型进行完全自动转换。但是大部分的路你都可以到达那里

Decimal
mpf
都支持标准的数学运算符。所以你不应该改变这些。您确实需要查看创建或输入浮点数的位置以及使用
math
函数的位置

首先,将处理显式创建的数字的
float(
的所有实例更改为
Decimal(
mpf(
)。 第二,搜索所有浮点文本并以相同的方式替换它们。您可以使用编辑器的搜索和替换功能,也可以为其编写一个小型Python脚本。因此,这可以在很大程度上实现自动化

然后查看所有从源(如文件或数据库)读取数据的函数,并对其进行更新。这可能必须手动完成,除非这些函数明确使用
float()
,在这种情况下,它们由上述方法处理

如果您当前使用的是
math
模块,则必须在所选模块中搜索这些函数并将其替换为等效函数。在这种情况下,搜索部分可以轻松实现自动化。 如果您使用了
import math
,您可以轻松地搜索“
math.
”以查找需要替换的函数。在这种情况下,使用
mpmath
时,您只需将“
math.
”替换为“
mpmath.
”,因为
mpmath
实现了
math
中的所有函数。
如果您使用了math import x、y、z中的
,则需要分别搜索x、y和z。您甚至可以编写一个脚本,将
数学
函数转换为
十进制
mpf
中的等价函数。这取决于代码库的大小和复杂性,是否值得这样做。

您正在询问是否可以n将Python内置的浮点文本类型从
float
更改为(例如)
decimal.decimal
。您不能这样做

需要考虑的其他事项

如果
decimal.decimal
是代码的中心,则可以使用较短的名称导入它:

from decimal import Decimal as Dec
x1 = Dec('0.234')
y1 = Dec('4.32')
x2 = Dec('4.321')
y2 = Dec('5.87')
类型批注可以帮助您避免错过转换:

def distance(x1: Dec, y1: Dec, x2: Dec, y2: Dec) -> Dec:
    return Dec.sqrt((x2 - x1)**2 + (y2 - y1)**2)
如果精度很重要,请使用字符串而不是浮点来初始化
decimal.decimal
。浮点不能准确表示简单的数字,例如0.2:

>>> Dec(0.2)
Decimal('0.200000000000000011102230246251565404236316680908203125')
>>> Dec('0.2')
Decimal('0.2')
您必须转换为
Decimal
的位置可能有限。对
Decimal
的大多数操作要么给出新的小数,要么抛出异常

>>> d = distance(x1, y1, x2, y2)
>>> d
Decimal('4.371048958774083555277441787')
>>> (d + x1*x2 + y1*y2**2) / 100
Decimal('1.542359709587740835552774418')

我知道这并不完美,但可能会有所帮助。

请举例说明我感兴趣的是什么意思,但我需要做的更多。这没有帮助,我指的是添加代码示例,说明您希望更改的内容。您需要重构多少代码?修改是否比尝试将浮点类型重新转换为十进制更容易(这可能会产生意想不到的后果)欢迎使用堆栈溢出。请向我们展示一些显示问题的示例代码。请阅读并遵循。