2011-08-25 77 views
20

我有一個雙(23.46)Math.ceil和Math.floor返回相同的值

而且使用方法Math.ceil和Math.floor和解析我的雙重這些方法,我得到了相同的值返回我,這是23 ...

我希望它四捨五入到24 ..換句話說,如果我有一個雙15.01,它應該仍然是四捨五入到16 ...我該如何做到這一點?

+5

請發表你展示如何得到Math.ceil(23.46)= 23重現的代碼? – smci

+0

與這個問題有些相關,如果double失去精度,ceil和floor可以打印相同的值,例如 System.out.println(「ceil:」+ Math.ceil((1000000000000000000L1)/2.0)); System.out.println(「floor:」+ Math.floor((10000000000000000000000 - 1)/ 2.0)); 都會給你5.0E17。 – Deep

回答

49

無法重現:

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代表 - 我沒有檢查 - 但這裏肯定不是這樣的。)

+5

「他們將返回相同的值的唯一時間是當輸入已經是一個整數」這最終成爲我的問題。愚蠢的錯誤在我身邊,謝謝你的幫助。 – Tiwaz89

3

當我運行

System.out.println(Math.ceil(23.46)); 
System.out.println(Math.ceil(15.01)); 

我得到

24.0 
16.0 

這不正是你想要的嗎?

4

代碼

System.out.println(Math.ceil(23.46)); 
System.out.println(Math.floor(23.46)); 

給我下面的輸出:

24.0 
23.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 
13
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