我有一個Number參數的方法,必須確定它是否小於int
。我想出了是這樣的:
Integer.valueOf(myInt) > (Integer) myNumber
將int與數值進行比較的最佳方法
它看起來相當笨拙對於這樣一個簡單的任務。此外,我不確定它是否會與BigDecimal
et.al.搭配良好,我需要測試哪些情況?
怎麼可能改進?
謝謝
我有一個Number參數的方法,必須確定它是否小於int
。我想出了是這樣的:
Integer.valueOf(myInt) > (Integer) myNumber
將int與數值進行比較的最佳方法
它看起來相當笨拙對於這樣一個簡單的任務。此外,我不確定它是否會與BigDecimal
et.al.搭配良好,我需要測試哪些情況?
怎麼可能改進?
謝謝
您的代碼將導致ClassCastException
如果myNumber
是什麼,但一個Integer
。
我會說這是與所有Number
類型正確處理的最好機會:
myInt > myNumber.doubleValue()
因爲double
擁有所有類型的範圍最廣,你可以轉換到Number
,也不會截斷分數。
myInt > myNumber.intValue()
但是,這將下降信息。
(double)myInt > myNumber.doubleValue()
演員是不必要的。 Java知道如何比較不同的基元類型。 –
確實如此,但是想明確說明是雙打比較(0.000001個問題)。 –
如果myNumber
是Long
的實例,那麼您可能會遇到問題。你可能會遇到溢出問題(如果你的Number
實際上大於Integer.MAX_VALUE
?)。
此外,您的Number
可能是double
,並且轉換爲int
會導致精度損失,因爲您的數字將被截斷。
轉換您的手機號碼double
可能是一個合理的解決方案:
myInt > myNumber.doubleValue();
的比較變得有點棘手,因爲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.1d
或0.1f
。這是因爲浮點數和雙精度不能準確地表示許多基10分數(而BigDecimal可以)。因此,從BigDecimal獲得雙精度值可能會導致錯誤的比較結果。但是,既然你正在比較這個問題,你不需要面對這個問題。
+ 1我肯定永遠不會得到一個非常大的BigInteger在這種情況下,但你正在提出一個很好的一般觀點 – kostja
你確定傳遞的Number總是一個Integer嗎?在這個例子中可能會出現一個強制性異常。 – StKiller
我不是,這就是爲什麼我問BigInteger,因爲它也有可能 – kostja
看看這個:http://stackoverflow.com/questions/480632/why-doesnt-java-lang-number-implement-comparable – CKuck