我有一个带Number参数的方法,必须确定它是否小于int
。我想出的是:
Integer.valueOf(myInt) > (Integer) myNumber
对于这么简单的任务来说,这看起来很笨拙。而且,我不确定它是否会与BigDecimal
et.al.很好地结合,我需要测试哪些情况?
怎么可以改进?
谢谢
答案 0 :(得分:4)
如果ClassCastException
不是myNumber
,则您的代码会生成Integer
。
我认为这最有可能正确处理所有Number
类型:
myInt > myNumber.doubleValue()
因为double
具有最广泛的所有类型,您可以将Number
转换为,并且不会截断分数。
答案 1 :(得分:4)
如果myNumber
是Long
的实例,则可能会遇到问题。您可能最终遇到溢出问题(如果您的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.1d
或0.1f
。这是因为浮点数和双精度数不能准确地表示许多基数10的分数(而BigDecimal可以)。因此从BigDecimal获取double值可能最终会给您错误的比较。但是,因为你在一个你不需要面对的问题中进行比较。