java将int与数字进行比较的最佳方法
我有一个带有数字参数的方法,必须确定它是否小于int
。我想到的是:
Integer.valueOf(myInt) > (Integer) myNumber
对于这么简单的任务来说,这看起来相当笨拙。此外,我不确定它是否能很好地与BigDecimal
et.al.合作,以及我需要测试哪些案例
如何改进
多谢各位
你可以在下面搜索框中键入要查询的问题!
我有一个带有数字参数的方法,必须确定它是否小于int
。我想到的是:
Integer.valueOf(myInt) > (Integer) myNumber
对于这么简单的任务来说,这看起来相当笨拙。此外,我不确定它是否能很好地与BigDecimal
et.al.合作,以及我需要测试哪些案例
如何改进
多谢各位
# 1 楼答案
如果
myNumber
不是Integer
,那么代码将导致ClassCastException
我认为这是正确处理所有
Number
类型的最佳机会:因为
double
在可以将Number
转换为的所有类型中,它的范围最广,并且不会截断分数# 2 楼答案
但这会导致信息丢失
# 3 楼答案
比较起来有点棘手,因为BigDecimal和BigInteger也扩展了数字。这些类可以保存大小不限的整数值(当然,受计算机内存的限制)
因此,如果您要求这些值的双精度值或长精度值,您可能会面临错误比较的风险,因为BigDecimal或BigInteger将被迫截断它们的值
最安全的做法是将数字转换为字符串,然后将该字符串交给BigDecimal类进行解析
例如
如果您确信永远不会得到biginger或BigDecimal实例的值超过double的最大正值或最大负值,那么使用Number应该是安全的。doubleValue以获取要比较的数字
您可能还面临一些额外的问题,比如必须比较大小数。这是因为大小数以10为基数表示其值,而其他数字子类则以2为基数
因此
new BigDecimal("0.1")
不等于0.1d
或0.1f
。这是因为float和double不能准确地表示许多基数为10的分数(而BigDecimal可以)。因此,从BigDecimal中获取双精度值可能会导致错误的比较。但是,由于您正在与ints进行比较,这是一个您不需要面对的问题# 4 楼答案
如果
myNumber
是Long
的实例,您可能会遇到问题。您可能最终会出现溢出问题(如果您的Number
实际上大于Integer.MAX_VALUE
,该怎么办?)此外,您的
Number
可能是一个double
,转换为int
会导致精度损失,因为您的数字会被截断将您的号码转换为
double
可能是一个合理的解决方案: