代码之家  ›  专栏  ›  技术社区  ›  amit

如何添加两个java.lang.number?

  •  36
  • amit  · 技术社区  · 14 年前

    Number a = 2;
    Number b = 3;
    //Following is an error:
    Number c = a + b;
    

    为什么数字不支持算术运算?JAVAM

    9 回复  |  直到 13 年前
        1
  •  26
  •   Pops Atula    14 年前

    Number 类,编译器也不知道您的数字是整数、浮点数还是其他什么。A.T

    开始编辑

    基于讨论,我想举个例子也许会有所帮助。A.A. 2. =9。但是正整数将数字存储为二进制,因此001110也可能意味着2+4+8=14 数字

    结束编辑

    你能做的是做一个小小的假设,然后转换成其中一种类型来做数学运算。所以你可以

    Number c = a.intValue() + b.intValue();
    

    你最好把它变成

    Integer c = a.intValue() + b.intValue();
    

    Float c = a.floatValue() + b.floatValue();
    

    如果您怀疑您没有处理整数,并且对可能出现的小精度问题没有问题。D

    BigDecimal c = new BigDecimal(a.floatValue()).add(new BigDecimal(b.floatValue()));
    
        2
  •  21
  •   Lorenzo Imperatrice SkidRunner    6 年前

    A.演出

    public static Number addNumbers(Number a, Number b) {
        if(a instanceof Double || b instanceof Double) {
            return a.doubleValue() + b.doubleValue();
        } else if(a instanceof Float || b instanceof Float) {
            return a.floatValue() + b.floatValue();
        } else if(a instanceof Long || b instanceof Long) {
            return a.longValue() + b.longValue();
        } else {
            return a.intValue() + b.intValue();
        }
    }
    
        3
  •  12
  •   Fritz Mock    9 年前

    JAVA

    Number a = 2f; // Foat
    Number b = 3d; // Double
    Number c = new BigDecimal( a.toString() ).add( new BigDecimal( b.toString() ) );
    

    A.它不会(应该?)产生任何副作用,比如溢出或丢失精度,只要number类型的toString()不会降低精度。

        4
  •  8
  •   Kevin Ji    8 年前

    java.lang.Number 只是原语类型的所有包装器类的超类(请参见 java doc double , int ,或相应的包装器类( Double , Integer 等)。

    考虑一下:

    Number a = 1.5; // Actually Java creates a double and boxes it into a Double object
    Number b = 1; // Same here for int -> Integer boxed
    
    // What should the result be? If Number would do implicit casts,
    // it would behave different from what Java usually does.
    Number c = a + b; 
    
    // Now that works, and you know at first glance what that code does.
    // Nice explicit casts like you usually use in Java.
    // The result is of course again a double that is boxed into a Double object
    Number d = a.doubleValue() + (double)b.intValue();
    
        5
  •  3
  •   Elie    14 年前

    使用以下选项:

    Number c = a.intValue() + b.intValue(); // Number is an object and not a primitive data type.
    

    int a = 2;
    int b = 3;
    int c = 2 + 3;
    
        6
  •  3
  •   extraneon    14 年前

    我认为你的问题有两个方面。

    为什么数字上不支持运算符+?

    因为Java语言规范没有指定这一点,并且没有运算符重载。A.

    (摘自我的评论:)

    A.尤其是对于原子类型,很难为add定义一个有用的契约。

    另外,如果您尝试将长添加到短,那么add方法也会有麻烦。

        7
  •  0
  •   fastcodejava    14 年前

    Number abstract number.longValue() number.intValue()

        8
  •  0
  •   Uri    14 年前

    一这里发生的事情是,当你创建2和3时,它们被解释为原语,在这种情况下创建了一个子类型(我认为是整数)。一

    A.它可以是整数,也可以是浮点,等等,所以数学运算的语义是不明确的。

    Number不提供经典的map操作,原因有两个:

    首先,Java中的成员方法不能是运算符。S一

    因此,您的职责是将转换回您感兴趣的特定原语类型,并应用数学运算符。

        9
  •  0
  •   azis.mrazish    9 年前

        10
  •  0
  •   muttonUp    4 年前

    如果你知道一个数字的类型,但不知道另一个数字的类型,你可以这样做

    public Double add(Double value, Number increment) {
       return value + Double.parseDouble(increment.toString());
    }
    

    但是它可能会很混乱,所以要注意潜在的准确性和准确性的损失 NumberFormatExceptions