在Python中划分大数字

Nat*_*ggs 7 python

我试图在Python中划分一些大数字,但我得到了一些奇怪的结果

NStr = "7D5E9B01D4DCF9A4B31D61E62F0B679C79695ACA70BACF184518" \
       "8BDF94B0B58FAF4A3E1C744C5F9BAB699ABD47BA842464EE93F4" \
       "9B151CC354B21D53DC0C7FADAC44E8F4BDF078F935D9D07A2C07" \
       "631D0DFB0B869713A9A83393CEC42D898516A28DDCDBEA13E87B" \
       "1F874BC8DC06AF03F219CE2EA4050FA996D30CE351257287" 

N = long(NStr, 16)
f2 = 476

fmin = N / float(f2)

print N - (fmin * float(f2))
Run Code Online (Sandbox Code Playgroud)

0.0按预期输出.但是,例如,如果我将代码更改为

fmin = N / float(f2)
fmin += 1
Run Code Online (Sandbox Code Playgroud)

我仍然得到一个输出 0.0

我也尝试过使用十进制包

fmin = Decimal(N) / Decimal(f2)
print Decimal(N) - (fmin * Decimal(f2))
Run Code Online (Sandbox Code Playgroud)

但这给了我一个输出 -1.481136900397802034028076389E+280

我假设我没有告诉python如何正确处理大数字,但我很难过从这里开始.

我还要补充一点,最终目标是计算

fmin = ceil(N / float(f2))
Run Code Online (Sandbox Code Playgroud)

尽可能长且准确

huo*_*uon 6

扩大对我的评论,如果Nf2long个不折不扣大于0,则

 fmin = (N - 1) // f2 + 1
Run Code Online (Sandbox Code Playgroud)

准确ceil(N / float(f2))(但比使用浮点数更准确)。

(使用//而不是/整数除法是为了与Python 3.x兼容,而无需付出额外的努力。)

这是因为N // f2(基本上)给您floor(N / float(f2)),所以N // f2 + 1几乎总是与相同ceil。但是,当N是的倍数时f2N // f2 + 1太大(+1不应在此处),但使用可以N - 1解决此问题,并且不会破坏其他情况。

(这不工作或者Nf2小于或等于0,但可以分开处理)