如何将泛型浮点值转换为相应的整数?

时间:2013-09-05 14:07:17

标签: python floating-point int decimal

我需要使用一个对整数进行数学运算的模块,但是我的输入是浮点数。

我想要实现的是将泛型浮点值转换为相应的整数值,并尽量减少数据。

例如:

val : 1.28827339907e-08
result : 128827339906934

乘以1e22后即可实现。

不幸的是,值的范围可能会发生变化,所以我不能总是将它们乘以相同的常数。有什么想法吗?

ADDED
换句话说,我有一个值矩阵< 1,让我们说从1.323224e-83.457782e-6

我希望将它们全部转换为整数,并尽量减少数据。

4 个答案:

答案 0 :(得分:2)

如果你想保留矩阵运算的值,我会选择一些值来将它们相乘。

例如:

1.23423
2.32423
4.2324534

将它们全部乘以10000000即可获得

12342300
23242300
42324534

您可以使用矩阵执行乘法,加法等。完成所有计算后,可以根据您执行的操作将它们全部除以适当的值,将它们转换回浮点数。

数学上它是有道理的,因为

(Scalar multiplication)
M1` = M1 * 10000000   
M2` = M2 * 10000000

Result = M1`.M2`
Result = (M1 x 10000000).(M2 x 10000000)
Result = (10000000 x 10000000) x (M1.M2)

因此,在乘法的情况下,您可以将结果除以10000000 x 10000000。

如果它的加法/减法,则只需除以10000000。

您可以通过了解您希望找到的小数,或者通过扫描浮点数并在运行时自己生成值来选择要乘以的值。

希望有所帮助。

编辑:如果你担心超过整数的最大容量 - 那么你会很高兴知道python会自动(并且默默地)将整数转换成long,当它注意到溢出时发生。你可以在python控制台中看到自己:

>>> i = 3423
>>> type(i)
<type 'int'>
>>> i *= 100000
>>> type(i)
<type 'int'>
>>> i *= 100000
>>> type(i)
<type 'long'>

如果你仍然担心溢出,你总是可以选择一个较低的常数,但是准确性稍差一些(因为你会在小数点的末尾丢失一些数字)。

此外,Eric Postpischil提出的方法似乎有道理 - 但我自己并没有尝试过。我从更多的数学角度给你一个解决方案,这似乎也更像是“pythonic”

答案 1 :(得分:2)

建议乘以十的幂的答案会导致不必要的舍入。

只要没有上溢或下溢,乘以浮点表示中使用的基数的乘法在IEEE 754算法(最常见的浮点实现)中没有错误。

因此,对于二进制浮点,您可以通过将浮点数乘以2的幂并将结果四舍五入到最接近的整数来实现目标。乘法将没有错误。对于整数的舍入可能会出现误差达到.5,显然。

您可以选择尽可能大的2的幂,而不会导致任何数字超出您正在使用的整数类型的范围。

最常见的浮点转换为整数截断,因此3.75变为3.我不确定Python语义。要进行舍入而不是截断,可以在转换为整数之前使用round之类的函数。

答案 2 :(得分:0)

或许可以考虑计算每个值的小数点后的位数,以确定指数(x)的值(1ex)。大致类似于here的问题。干杯!

答案 3 :(得分:0)

这是一个解决方案:

def to_int(val):
    return int(repr(val).replace('.', '').split('e')[0])

用法:

>>> to_int(1.28827339907e-08)
128827339907