"(int)的Math.ceil(双)"即使值大于1,也始终返回1

时间:2015-05-17 10:24:35

标签: java casting int double rounding

我正在创建一个Android应用,我需要计算设备的移动速度。我通过平均一些早期的位置'来做到这一点。速度。
但是,我需要km/h作为int的速度,所以我使用

(int)Math.ceil(speedAsDouble)

但是,即使1speedAsDouble7.8825246,这始终等于0.58178。 这是代码的相关部分:

// Create a variable for the speed
double speedAsDouble = 0d;

// Loop through the last points
for(int i = 0; i < lastPoints.size() - 1; i++)
{
    // Add the speed for the current point to the total speed
    speedAsDouble += (double)(lastPoints.get(i).distanceTo(lastPoints.get(i + 1)) / (lastPoints.get(i + 1).getTime() - lastPoints.get(i).getTime()));
}

// Divide the speed by the number of points
speedAsDouble /= (double)lastPoints.size();
// Convert the speed to km/h
speedAsDouble *= 3.6d;

// Log the speed
System.out.println("Speed: " + speedAsDouble);

然后我将数字四舍五入,并使用

将其转换为如上所述的int
int speedAsInt = (int)Math.ceil(speedAsDouble)

并使用

再次记录该号码
System.out.println("Rounded speed: " + speedAsInt)

以下是日志的一部分:

05-17 12:00:42.605  24610-24610/package I/System.out﹕ Speed: 0.0
05-17 12:00:42.635  24610-24610/package I/System.out﹕ Rounded speed: 0
05-17 12:00:43.625  24610-24610/package I/System.out﹕ Speed: 7.026718463748694E-4
05-17 12:00:43.645  24610-24610/package I/System.out﹕ Rounded speed: 1
05-17 12:00:44.595  24610-24610/package I/System.out﹕ Speed: 5.27003884781152E-4
05-17 12:00:44.615  24610-24610/package I/System.out﹕ Rounded speed: 1
05-17 12:00:45.595  24610-24610/package I/System.out﹕ Speed: 4.216031078249216E-4
05-17 12:00:45.635  24610-24610/package I/System.out﹕ Rounded speed: 1
05-17 12:00:46.595  24610-24610/package I/System.out﹕ Speed: 0.002668234216980636
05-17 12:00:46.605  24610-24610/package I/System.out﹕ Rounded speed: 1

我花了很多时间看这个,尝试不同的变量类型和投射变量但没有成功。

2 个答案:

答案 0 :(得分:4)

在您打印的所有输出中(第一个输出为0除外)Speed小于1(7.026718463748694E-45.27003884781152E-4等...)。注意负指数。

因此,毫无疑问ceil会返回1。

答案 1 :(得分:1)

请仔细查看输出结果,例如:

05-17 12:00:43.625 24610-24610/package I/System.out﹕ Speed: 7.026718463748694E-4

并不意味着你有7.02,而是0.000702。最后有E-4。当您使用ceil时,它将始终返回1.