Android Studio 0.5.2
您好,
我有一个随机浮动值,我想转换为int。
浮点数可以在-9.4182062E-9
到9.593071E-8
之间有一个随机数。
我只想得到正数int,所以如果数字是负的,即-5.5115866E-8
它应该只返回5.我已经使用了Math.abs。
我尝试了以下内容:
int accel = (int)Math.abs(randomAccel);
但是,无论accel
是什么价值,randomAccel
都会给我零。
非常感谢任何建议,
答案 0 :(得分:3)
您的负数-5.485747E-5
按E-5
结束,表示它为-0.0000548574
所以绝对值是0.0000548574
。
所以Math.abs(-0.0000548574)
是0.0000548574
(int)0.0000548574
是0
结果为0
您确定您的代码是否响应0
,无论随机值如何?检查您要转换的号码。
您应该使用您的值对代码进行单元测试。
答案 1 :(得分:1)
您的随机数范围非常小(负指数) - 重要的是它小于+/-1
。当float
投放到int
时,所有小数部分都会被截断,因此,在将符号设置为正数后,您范围内的每个数字都会生成0
如果转为int
。
您似乎想忽略数字的指数。一种方法是:
int accel = Integer.parseInt(String.valueOf(randomAccel).replaceAll("-?(\\d+).*", "$1"));
答案 2 :(得分:1)
int accel = (int)Math.abs(randomAccel);
这一行执行3个步骤
randomAccel
int
(浮点数被截断)int
值分配给accel
现在让我们看看当输入在[-9.4182062E-9,9.593071E-
8]
范围内时会发生什么(顺便说一下-5.485747E-5
不在此范围内。)
Input value -9.4E-9 = -0.0000000094
1. -9.4E-9 converted to 9.4E-9
2. 9.4E-9 cast to int, fractional part is removed. Value is 0
3. 0 is assigned to `accel`
如果您只想要最重要的数字,您可以乘以10^8
并查看该值是否大于0
,如果是则为trucate,否则乘以10然后截断:
int accel = 0;
r = Math.abs( randomAccel ) * 100000000;
if( r >= 10 ) {/* error out of range */}
else if( r > 0 ) accel = (int)r;
else
{
r *= 10;
accel = (int)r;
}
答案 3 :(得分:1)
import static java.lang.Math.*;
转换部分:
double input =-5.485747E-5; //for example
double tmp = abs(input);
tmp *= pow(10, abs(floor(log10(tmp))));
int out = (int) tmp;
System.out.println(out);
输出:
5