2011-12-01 56 views
1

我有時傾向於使用(double)(long)(a * b/c)將結果的整數部分存儲爲double。這對於負數也適用。用於檢索double的整數部分的Java類型轉換爲double

有沒有更好的方法來實現同樣的事情,因爲我認爲類型轉換是一個代價高昂的操作。

請注意我正在尋找整數部分的數字,而不是四捨五入的值。 例如:

MyObj.setDouble((double)(long)(522.99)) 
MyObj.getDouble() returns 522.0 and not 523.0 

謝謝。

+12

你相信嗎?你是否執行過任何分析,以確定這是真正的應用程序中的重大性能影響? –

+1

不要猜測,測量,因爲即使你十多年來一直在做這類事情,你會驚訝你錯了多少次。 ;)通常'Math.floor'和'Math.round'比使用模型慢2-4倍,但你應該自己測試一下。 –

+0

那麼,我沒有對此進行任何分析。我的錯。我不應該沒有證據就跳到結論。雖然我想擺脫兩步式類型化,因爲這看起來很醜。 –

回答

0

性能不是問題。但代碼(double)(long)(a*b/c)是醜陋的。

double d = a*b/c;一模一樣double d = (double)(long)a*b/c;

從下移動到上的類型時,卻從未需要執行鑄造:實際上,你如果分配結果爲'雙變量不需要鑄造的。原語(例如intdouble)和類別(例如ArrayListList)是正確的。

+0

即使兩個結果都是double類型,'2 * 5/3'與'(double)(long)(2 * 5/3)'的結果並不相同。 –

+0

當然,那些2,5和3應該被解釋爲雙打,而不是整數或長整數... –

4

嘗試Math.rint(double)Math.round(double)。無論性能差異如何,它至少更清晰簡潔。

[編輯]

在回答您的澄清的問題 - 「我怎麼得到整數部分雙無鑄造」(儘管你的頭銜詢問四捨五入),試試這個:

public static double integerPart(double d) { 
    return (d <= 0) ? Math.ceil(d) : Math.floor(d); 
} 
integerPart(522.99); // => 522d 
integerPart(-3.19); // => -3d 

當然,由於它使用了比較和方法調用,所以此表單可能不會比鑄造更快。

+0

這不會解決我的問題,因爲我想整數部分而不是四捨五入的值。 –

+0

@ManishMulani:看到我更新的答案。此外,請考慮編輯您的問題(特別是標題),具體詢問獲取數字的*整數部分*而不是*舍入*。 – maerics

+0

我曾經使用這種方法(ceil和floor),直到我發現Math.ceil(-0.12)返回-0.0而不是0.0。不幸的是,對於-0.0和0.0,equals()方法的行爲不同。 –

0

Math.floor(double)怎麼樣我不能看到整數部分和排序之間的區別。

+0

這不適用於負數。 Math.floor(-3.19)會給-4.0 –