在Python中将float转换为bigint时,防止溢出的好方法是什么?

What is a good way to prevent overflows when converting float to bigint in Python?

当修剪除法产生的大小数时,我遇到了溢出问题。 例如:

>>> from math import floor
>>> int(100000000000000123.1)
100000000000000128
>>> floor(100000000000000123.1)
100000000000000128

从类型来看,数字似乎是一个普通的浮点数,无法以所需的精度存储。因此,即使使用 floor() 我 运行 也会遇到同样的问题。 有没有更好的数据类型来存储'long floats/doubles'?如果是,我如何强制 bigints 的划分不 return 低精度浮点数? 顺便说一句,我正在使用 Python 3.6 64 位。

您需要 stdlib 模块 decimal

import decimal

long_number = '100000000000000123.1'  # note that this is a string
your_decimal = decimal.Decimal(long_number)

Decimal 足够聪明 return Decimal 来自任何标准数学运算的对象

result = your_decimal - 123
assert isinstance(result, decimal.Decimal)
assert your_decimal == decimal.Decimal('100000000000000000.1')