Python3 大浮点数的停止除法

Posted

技术标签:

【中文标题】Python3 大浮点数的停止除法【英文标题】:Python3 Stop division for large floats 【发布时间】:2017-01-15 23:09:45 【问题描述】:

我正在划分非常大的整数,可以说是 1kb 整数,我已经遇到了 2 个问题。要么

溢出错误:整数除法结果对于浮点数来说太大

或者浮点数被四舍五入到一些数字,当我尝试乘回来时,我得到一个稍微不同的数字。

在 python 中有什么方法可以防止分割小数点后超过 20 位的浮点数?

smallest_floats = []

n1 = int(input())
n2 = int(input())

while n2 != 1:
  smallest_floats.append(str(n1/n2))
     n2 -= 1
print(min(smallest_floats, key=len))

我认为可能的解决方案是以某种方式断言分裂或:

len(s.split(".")[-1]) > 20

【问题讨论】:

您是否尝试过使用decimal 包?或者如果你想要整数除法,如果你使用//而不是/会发生什么? python 中的浮点数是通常的 64 位双精度浮点数。对于您想要做的事情,您需要导入一个多精度包。 Scipy 或 Sympy 可能有类似的东西。 我需要复制数字,所以我需要浮点数。 查看fractions 包,了解有理数的算术运算。 或者您可以使用Fraction 来避免丢失任何精度... 【参考方案1】:

对于没有精度损失的有理数算术,您可以使用fractions package 中的fractions.Fraction 类。您可以除以另一个有理数,然后再乘以它,以获得与开始时完全相同的有理数。

>>> from fractions import Fraction
>>> n1 = Fraction(large_numerator, denominator)
>>> n2 = n1 / some_rational_number
>>> assert n1 == n2 * some_rational_number

【讨论】:

U 最终使用了 Fraction,因为它在 95% 的情况下对我的情况更有效,解决方案是 Fractions。【参考方案2】:

导入具有任意精度的decimal 模块(https://docs.python.org/2/library/decimal.html

你可以增加显示的小数位数

>>> from decimal import *
>>> getcontext().prec = 100
>>> Decimal(2).sqrt()
Decimal('1.414213562373095048801688724209698078569671875376948073176679737990732478462107038850387534327641573') 100 decimal digits

how can i show an irrational number to 100 decimal places in python?

【讨论】:

如果必须精确复制原始整数,这不是最好的工具(尽管它可能在大多数情况下都有效)。请尝试以下操作:d1 = Decimal(1.0); d2 = d1 / Decimal(3.0); assert d1 == d2 * Decimal(3.0)。这将引发AssertionError,因为d2 * Decimal(3.0) 的计算结果为Decimal('0.9999999999999999999999999999')。这里的重点是 Decimal 提供(几乎)任意精度 - 但不是 infinite 精度。 @a_guest 所以小数不是无限精确而分数是正确的?意思是使用分数模块我可以找回原来的? @Adminy 是的Fraction 将有理数表示为分子和分母,因此可以精确地表示所有有理数(当然,只要它们的数字和分母适合记忆)。使用decimal 模块,您可以选择任意 精度,该精度(当然)不能是infinite(例如,您不能存储无限个小数位)。考虑示例1/3Fraction(1, 3) 是精确表示,而Decimal(1.0) / Decimal(3.0) 将在您指定的精度之后删除小数位。 我发现这个答案仍然很有用^^它也对我有帮助。

以上是关于Python3 大浮点数的停止除法的主要内容,如果未能解决你的问题,请参考以下文章

Python pandas 带有 to_csv 的大浮点数

有关Java大浮点数BigDecimal的简单使用[连续更新]

为啥整数除法产生一个浮点数而不是另一个整数?

Python中整数运算除法,输出带浮点数

python3----运算符

js 后端返回浮点数,前端用乘法或者除法处理,得到超常值