2011-12-02 104 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

相关问题