2014-03-26 173 views
0
Android Studio 0.5.2 

你好,转换浮点数为int

我有,我想转换为int的随机浮点值。

该float可以有一个-9.4182062E-99.593071E-8之间的随机数。

我只想得到正整数,所以如果数字是负的,即-5.5115866E-8它应该只返回5.我已经使用了Math.abs。

我曾尝试以下:

int accel = (int)Math.abs(randomAccel); 

然而,accel一直给我一个零不管randomAccel是什么样的价值。

非常感谢您的任何建议,

+0

http://stackoverflow.com/q/1295424/2282538 – Tyler

回答

3

你负数-5.485747E-5完成由E-5这意味着它是-0.0000548574 所以绝对值0.0000548574

所以Math.abs(-0.0000548574)0.0000548574

(int)0.00005485740

结果是0

是你的确保您的代码是响应0不管的随机值?检查您尝试转换的号码。

你应该用你的值单元测试你的代码。

1

您的随机数范围具有非常小的幅度(负指数) - 重要的是它小于+/-1。当float投射到int时,所有小数部分都是截取,因此在将符号设置为正数后,范围内的每个数字将导致0(如果转换为int)。

看起来你想忽略你的数字的指数。要做到这一点的方法之一是:

int accel = Integer.parseInt(String.valueOf(randomAccel).replaceAll("-?(\\d+).*", "$1")); 
1
int accel = (int)Math.abs(randomAccel); 

该行执行3个步骤

  1. 获取的randomAccel
  2. 绝对值的值强制转换为int(浮点数被截断)
  3. 指定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; 
} 
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