"(int)Math.ceil(double)" 总是 return 1,即使值大于 1
"(int)Math.ceil(double)" always return 1, even when the value is greater than 1
我正在创建一个 Android 应用程序,我需要计算设备的移动速度。我通过取一些较早位置的平均速度来做到这一点。
但是,我需要速度在 km/h
作为 int
,所以我使用
(int)Math.ceil(speedAsDouble)
但是,这始终等于 1
,即使 speedAsDouble
是 7.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
我花了很多时间研究这个,尝试不同的变量类型和转换变量但没有成功。
在您打印的所有输出中(第一个为 0 的除外)Speed
小于 1(7.026718463748694E-4
、5.27003884781152E-4
等...)。注意负指数。
难怪ceil
returns 1.
请仔细查看您的输出,例如:
05-17 12:00:43.625 24610-24610/package I/System.out﹕ Speed: 7.026718463748694E-4
并不意味着你有 7.02,而是 0.000702。最后有E-4
。当你使用 ceil 时,它总是 return 1.
我正在创建一个 Android 应用程序,我需要计算设备的移动速度。我通过取一些较早位置的平均速度来做到这一点。
但是,我需要速度在 km/h
作为 int
,所以我使用
(int)Math.ceil(speedAsDouble)
但是,这始终等于 1
,即使 speedAsDouble
是 7.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);
然后我使用
将数字四舍五入并如上所述将其转换为 intint 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
我花了很多时间研究这个,尝试不同的变量类型和转换变量但没有成功。
在您打印的所有输出中(第一个为 0 的除外)Speed
小于 1(7.026718463748694E-4
、5.27003884781152E-4
等...)。注意负指数。
难怪ceil
returns 1.
请仔细查看您的输出,例如:
05-17 12:00:43.625 24610-24610/package I/System.out﹕ Speed: 7.026718463748694E-4
并不意味着你有 7.02,而是 0.000702。最后有E-4
。当你使用 ceil 时,它总是 return 1.