将int与Number进行比较的最佳方法

时间:2011-12-02 12:15:58

标签: java comparison numbers primitive-types

我有一个带Number参数的方法,必须确定它是否小于int。我想出的是:

Integer.valueOf(myInt) > (Integer) myNumber

对于这么简单的任务来说,这看起来很笨拙。而且,我不确定它是否会与BigDecimal et.al.很好地结合,我需要测试哪些情况?

怎么可以改进?

谢谢

4 个答案:

答案 0 :(得分:4)

如果ClassCastException不是myNumber,则您的代码会生成Integer

我认为这最有可能正确处理所有Number类型:

myInt > myNumber.doubleValue()

因为double具有最广泛的所有类型,您可以将Number转换为,并且不会截断分数。

答案 1 :(得分:4)

如果myNumberLong的实例,则可能会遇到问题。您可能最终遇到溢出问题(如果您的Number实际上大于Integer.MAX_VALUE会怎么样?)。

此外,您的Number可能是double,转换为int会导致精确度下降,因为您的号码会被截断。

将您的号码转换为double可能是一个合理的解决方案:

myInt > myNumber.doubleValue();

答案 2 :(得分:2)

myInt > myNumber.intValue()

但这会丢失信息。

(double)myInt > myNumber.doubleValue()

答案 3 :(得分:2)

比较变得有点棘手,因为BigDecimal和BigInteger也扩展了Number。这些类可以保存无限大小的整数值(好吧,受到计算机内存的限制)。

因此,如果你要求这些的双值或长值,你可能会冒错误的比较,因为BigDecimal或BigInteger将被迫截断它们的值。

最安全的做法是将Number转换为String,然后将此String提供给要解析的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的实例,其值超过double的最大正值或最大值,那么使用Number.doubleValue获取要与之比较的数字应该是安全的。 / p>

您可能会遇到其他问题,可能需要比较BigDecimals。这是因为BigDecimals在基数10中表示它们的值,而其他数字子类使用基数2。

因此new BigDecimal("0.1")不等于0.1d0.1f。这是因为浮点数和双精度数不能准确地表示许多基数10的分数(而BigDecimal可以)。因此从BigDecimal获取double值可能最终会给您错误的比较。但是,因为你在一个你不需要面对的问题中进行比较。