Math.ceil和Math.floor返回相同的值

22

我有一个双精度数 (23.46)

使用 Math.ceil 和 Math.floor 方法并将我的双精度数解析到这些方法中,我得到了相同的返回值,即 23...

我希望它舍入为 24.. 换句话说,如果我有一个双精度数是 15.01,它仍应该被舍入为 16... 我该怎么做?


7
请发布可重现的代码,展示如何得出 Math.ceil(23.46) = 23 的结果? - smci
1
与此问题有些相关的是,如果double类型失去精度,ceil和floor函数可能会打印相同的值,例如:System.out.println("ceil: " + Math.ceil((1000000000000000000L - 1) / 2.0));System.out.println("floor:" + Math.floor((1000000000000000000L - 1) / 2.0));两者都将输出5.0E17。 - Deep
7个回答

52

无法重现:

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 - 我没有检查 - 但这显然不是这种情况。)


6
只有当输入已经是整数时,它们才会返回相同的值。这最终成为了我的问题。是我愚蠢的错误,谢谢你的帮助。 - user818700

16
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

4
代码
System.out.println(Math.ceil(23.46));
System.out.println(Math.floor(23.46));

给我以下输出:

24.0
23.0

所以它按预期工作。


3
当我运行时
System.out.println(Math.ceil(23.46));
System.out.println(Math.ceil(15.01));

我理解

24.0
16.0

这不是你想要的吗?


3

你如何进行实际调用?我无法复制你的结果,使用双重对象或原始类型均无效。

以下是代码:

    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

0
在我的情况下,我正在将 int 进行除法,然后应用 ceil 函数,这会返回像上面那样奇怪的结果。
例如:
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

0
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));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接