2011-12-02 151 views
1

我有一個Number參數的方法,必須確定它是否小於int。我想出了是這樣的:

Integer.valueOf(myInt) > (Integer) myNumber將int與數值進行比較的最佳方法

它看起來相當笨拙對於這樣一個簡單的任務。此外,我不確定它是否會與BigDecimal et.al.搭配良好,我需要測試哪些情況?

怎麼可能改進?

謝謝

+0

你確定傳遞的Number總是一個Integer嗎?在這個例子中可能會出現一個強制性異常。 – StKiller

+0

我不是,這就是爲什麼我問BigInteger,因爲它也有可能 – kostja

+1

看看這個:http://stackoverflow.com/questions/480632/why-doesnt-java-lang-number-implement-comparable – CKuck

回答

4

您的代碼將導致ClassCastException如果myNumber是什麼,但一個Integer

我會說這是與所有Number類型正確處理的最好機會:

myInt > myNumber.doubleValue() 

因爲double擁有所有類型的範圍最廣,你可以轉換到Number,也不會截斷分數。

+0

最快的正確答案。 – kostja

+0

btw。爲什麼使用doubleValue()來比較一個int? wouldnt intValue()更有意義?還是有一些怪癖? – kostja

+0

@kostja:數字可能有一個小數部分,intValue()會截斷,導致比較錯誤的結果(可能不是你的情況,但肯定是其他的) –

2
myInt > myNumber.intValue() 

但是,這將下降信息。

(double)myInt > myNumber.doubleValue() 
+0

演員是不必要的。 Java知道如何比較不同的基元類型。 –

+0

確實如此,但是想明確說明是雙打比較(0.000001個問題)。 –

4

如果myNumberLong的實例,那麼您可能會遇到問題。你可能會遇到溢出問題(如果你的Number實際上大於Integer.MAX_VALUE?)。

此外,您的Number可能是double,並且轉換爲int會導致精度損失,因爲您的數字將被截斷。

轉換您的手機號碼double可能是一個合理的解決方案:

myInt > myNumber.doubleValue(); 
2

的比較變得有點棘手,因爲BigDecimal和BigInteger的還擴展號碼。這些類可以保存無限大小的整數值(很好,受計算機內存限制)。因此,如果您要求雙倍值或長期值,您可能會冒險錯誤比較,因爲BigDecimal或BigInteger將被迫截斷其值。

最安全的做法是將數字轉換爲字符串,然後將此字符串賦予BigDecimal類進行解析。

例如。

Number n = ...; 
int i = ...; 

BigDecimal m = new BigDecimal(n.toString()); 
BigDecimal j = new BigDecimal(i); 

boolean result = j.compareTo(m) < 0; 
// equivalent to i < n 

如果你確定,你將永遠不會得到的BigInteger或BigDecimal,其值超過兩倍的最大正或負的最大值,那麼它應該是安全的使用Number.doubleValue得到一個號碼的一個實例相比於。

還有其他問題,您可能會面臨必須比較BigDecimals的可能性。這是因爲BigDecimals以10爲基數表示它們的值,而其他Number子類使用基2。因此new BigDecimal("0.1")不等於0.1d0.1f。這是因爲浮點數和雙精度不能準確地表示許多基10分數(而BigDecimal可以)。因此,從BigDecimal獲得雙精度值可能會導致錯誤的比較結果。但是,既然你正在比較這個問題,你不需要面對這個問題。

+0

+ 1我肯定永遠不會得到一個非常大的BigInteger在這種情況下,但你正在提出一個很好的一般觀點 – kostja

相關問題