在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')
当修剪除法产生的大小数时,我遇到了溢出问题。 例如:
>>> 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')