python - 在 Python 中除大数

标签 python

我正在尝试用 Python 对一些大数进行除法,但我得到了一些奇怪的结果

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

N = long(NStr, 16)
f2 = 476

fmin = N / float(f2)

print N - (fmin * float(f2))

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

fmin = N / float(f2)
fmin += 1

我仍然得到 0.0

的输出

我也试过用小数包

fmin = Decimal(N) / Decimal(f2)
print Decimal(N) - (fmin * Decimal(f2))

但这给了我 -1.481136900397802034028076389E+280

的输出

我假设我没有告诉 python 如何正确处理大数字,但我不知道从这里去哪里。

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

fmin = ceil(N / float(f2))

越长越好

最佳答案

扩展我的评论,如果 Nf2 是严格大于 0 的 long,则

 fmin = (N - 1) // f2 + 1

完全是 ceil(N/float(f2))(但比使用 float 更准确)。

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

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

(这对小于或等于 0 的 Nf2 都不起作用,但可以单独处理)

关于python - 在 Python 中除大数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10121861/

相关文章:

python - 分发 .pyc 文件有什么限制?

python 和 PEP 440 - 这个关于 PEP440 的警告有多严重?

python - python中的编译指示

python - Python 中的第一次绘制时间(可能使用或不使用 Selenium)?

python - 如何在更改 TIME_ZONE 设置时保持 UTC 时间记录?

python - Pandas 数据框到没有索引的json

python - 使用 mypy,我如何键入注释一个装饰器来装饰接受某个东西的子类的函数?

python - 打印和格式化实例

python - 当包含有意义的空格时,如何编写与 re.VERBOSE 一起使用的模式?

python - 在 Python 中从控制台使用断点进行调试