我有一个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