在Python中,将浮点与非常大的整数相乘

在Python中,将浮点与非常大的整数相乘,python,floating-point,largenumber,Python,Floating Point,Largenumber,在Python中,有没有办法将浮点与非常大的整数相乘 例如,我尝试了print(10**100000)*1.414 它给了我: 溢出错误:long int太大,无法转换为float 请注意,这些值(浮点和那个大数字)可以是任何值。更重要的是,我需要表达式的精确值(四舍五入到最接近的整数) 请提供任何解决方案。编辑2: 好的,我明白你的意思了: import mpmath mpmath.mp.dps = 100005 i = int(mpmath.mpf("1.414") * 10 ** 100

在Python中,有没有办法将浮点与非常大的整数相乘

例如,我尝试了
print(10**100000)*1.414
它给了我:

溢出错误:long int太大,无法转换为float

请注意,这些值(浮点和那个大数字)可以是任何值。更重要的是,我需要表达式的精确值(四舍五入到最接近的整数)


请提供任何解决方案。

编辑2:

好的,我明白你的意思了:

import mpmath

mpmath.mp.dps = 100005
i = int(mpmath.mpf("1.414") * 10 ** 100000)

print(str(i)[:10])        # 1414000000
print(len(str(i)))        # 100001
print(str(i)[-10:])       # 0000000000
print(str(i).count("0"))  # 99997
对于@Stefan:

int(mpmath.mpf("1.414") * (10 ** 100000 + 1000))
返回

14140000000000000 ... 000000000001414     # string contains 99993 0s

将浮点转换为整数比率:

value = 1.414
large = 10**100000

a, b = value.as_integer_ratio()
number, residual = divmod(large * a, b)
number += residual*2 >= b   

由于您接受整数近似,因此这里有一个本机解决方案:

def getint(x, y, z):
    z_nu, z_de = z.as_integer_ratio()
    return ((x**y) * z_nu) // z_de
用法:

>>> getint(2, 3, 5.)
40

>>> getint(10, 100000, 1.414)
1413999999999999923616655905789230018854141235351562500000000...  # truncated
如果要查找准确的值,这意味着您必须以字符串形式访问
1.414
(否则,存储在内存中的值也不准确)


“更重要的是,我想要表达式的精确值”-那么为什么要使用浮点?浮点运算几乎总是不精确的,即使是将源代码字符
1.414
转换为浮点的操作也是如此。但mpmath不是python的本机模块!您的结果是错误的,因为浮点值实际上是1。4139999999999999236166559057892300188541412353515625@Sushil,您从未要求使用python本机模块。
1.414*(mpmath.mpf(10.)**100000+1)
给出相同的值还是不同的值?它应该给出一个不同的值。是的,你更新的代码有足够的精度。对于这个案子。您硬编码了需要多少。一般来说不起作用。此外,您还更改了其中一个值(浮点值)。正确的设置就像Daniel所做的那样(设置两个变量
value=1.414
large=10**100000
,并处理这些变量)。这四舍五入而不是最接近的整数。没有给出更准确的值。我试了10次你的密码**100@SushilVerma是的,这证明你错了。它给出了精确的值。@StefanPochmann在10^100时,它没有给出:overflowerrror:long int太大,无法转换为float。这就是为什么我声称print int((10**100000)*1.414)给出了正确的值。我不确定。@SushilVerma是的,那么呢?@SushilVerma实际上,你是在用
10000000000000001590289110975991804683608085394528138978327557747878787878772170810613469985858815104.0构建
1.413999999999923616590579892300188541412353515625
的产品。所以问题是,什么是10**100?我删除了,因为引用@Stefan Pochmann,这不准确。例如,您使用(十进制(10**100000)+1)*十进制(1.414)得到相同的值,但不应该这样做。此外,您所做的使情况变得更糟,因为您正在更改值。而且不清楚如何将浮点数变成字符串。@StefanPochmann我不确定我是否理解第一点。关于第二点,OP似乎必须以字符串的形式访问该值,否则1.414甚至不能作为精确值存储在内存中。@JaredGoguen我知道1.414不是浮点的精确值。这就是重点。
import decimal

float_string = '1.614' # to show that rounding works
exponent = 100000
decimal.getcontext().prec = exponent + 1

c = 10 ** exponent + 1
d = decimal.Decimal(float_string) * c

print d #1614000.....000002