我需要使用一个对整数进行数学运算的模块,但是我的输入是浮点数。
我想要实现的是将泛型浮点值转换为相应的整数值,并尽量减少数据。
例如:
val : 1.28827339907e-08
result : 128827339906934
乘以1e22后即可实现。
不幸的是,值的范围可能会发生变化,所以我不能总是将它们乘以相同的常数。有什么想法吗?
ADDED
换句话说,我有一个值矩阵< 1,让我们说从1.323224e-8
到3.457782e-6
。
我希望将它们全部转换为整数,并尽量减少数据。
答案 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