我有一个双精度数 (23.46)
使用 Math.ceil 和 Math.floor 方法并将我的双精度数解析到这些方法中,我得到了相同的返回值,即 23...
我希望它舍入为 24.. 换句话说,如果我有一个双精度数是 15.01,它仍应该被舍入为 16... 我该怎么做?
我有一个双精度数 (23.46)
使用 Math.ceil 和 Math.floor 方法并将我的双精度数解析到这些方法中,我得到了相同的返回值,即 23...
我希望它舍入为 24.. 换句话说,如果我有一个双精度数是 15.01,它仍应该被舍入为 16... 我该怎么做?
无法重现:
public class Test
{
public static void main(String[] args)
{
System.out.println(Math.ceil(23.46)); // Prints 24
System.out.println(Math.floor(23.46)); // Prints 23
}
}
我怀疑你要么没有得到你认为已经获取的输入数据,要么你没有输出你认为的输出数据。Math.floor
/ceil
本身是正常工作的。它们返回相同的值仅当输入已经是一个整数时。你谈论解析你的双精度数...我的猜测是错误就在那里。请向我们展示一个简短但完整的程序,以演示问题。
(可能还有其他关于非常大的值的情况,目标整数不能精确地表示为double
- 我没有检查 - 但这显然不是这种情况。)
float x = ((float)2346/100); // You should type cast. Otherwise results 23
Math.ceil(x); // So Math.ceil(23) is 23 !!!
// Here I type cast to float.
// So I get the result 24
System.out.println(Math.ceil(23.46));
System.out.println(Math.floor(23.46));
给我以下输出:
24.0
23.0
所以它按预期工作。
System.out.println(Math.ceil(23.46));
System.out.println(Math.ceil(15.01));
我理解
24.0
16.0
这不是你想要的吗?
你如何进行实际调用?我无法复制你的结果,使用双重对象或原始类型均无效。
以下是代码:
Double d_object = new Double(23.46);
double d_simple = 23.46;
System.out.println("Ceiling simple: " + Math.ceil(d_simple));
System.out.println("Floor simple: " + Math.floor(d_simple));
System.out.println("Ceiling object: " + Math.ceil(d_object));
System.out.println("Floor object: " + Math.floor(d_object));
能够为我提供:
Ceiling simple: 24.0
Floor simple: 23.0
Ceiling object: 24.0
Floor object: 23.0
Math.ceil(5/2) // gives 2
Math.floor(5/2) // gives 2
解决方法是在除法时使用双精度,总是尝试将除法转换为double/float类型
Math.ceil(5/(double)2) // gives 3
Math.floor(5/(double)2) // gives 2
int num1 ,num2;
Scanner scan = new Scanner(System.in);
num1 = scan.nextInt();
num2 = scan.nextInt();
int result = num1 / num2;
System.out.println("floor "+num1+" / "+num2+" = "+Math.floor(result));
System.out.println("ceil "+num1+" / "+num2+" = "+Math.ceil(result));
System.out.println("round "+num1+" / "+num2+" = "+Math.round(result));