有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java将int与数字进行比较的最佳方法

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

Integer.valueOf(myInt) > (Integer) myNumber

对于这么简单的任务来说,这看起来相当笨拙。此外,我不确定它是否能很好地与BigDecimalet.al.合作,以及我需要测试哪些案例

如何改进

多谢各位


共 (4) 个答案

  1. # 1 楼答案

    如果myNumber不是Integer,那么代码将导致ClassCastException

    我认为这是正确处理所有Number类型的最佳机会:

    myInt > myNumber.doubleValue()
    

    因为double在可以将Number转换为的所有类型中,它的范围最广,并且不会截断分数

  2. # 2 楼答案

    myInt > myNumber.intValue()
    

    但这会导致信息丢失

    (double)myInt > myNumber.doubleValue()
    
  3. # 3 楼答案

    比较起来有点棘手,因为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
    

    如果您确信永远不会得到biginger或BigDecimal实例的值超过double的最大正值或最大负值,那么使用Number应该是安全的。doubleValue以获取要比较的数字

    您可能还面临一些额外的问题,比如必须比较大小数。这是因为大小数以10为基数表示其值,而其他数字子类则以2为基数

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

  4. # 4 楼答案

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

    此外,您的Number可能是一个double,转换为int会导致精度损失,因为您的数字会被截断

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

    myInt > myNumber.doubleValue();