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

我有两个号码。例如:


Number a = 2;

Number b = 3;

//Following is an error:

Number c = a + b;

为什么Numbers不支持算术运算?无论如何,我如何在java中添加这两个数字?(当然我从某个地方得到它们,我不知道它们是Integer还是float等)。


胡子哥哥
浏览 388回答 3
3回答

呼如林

你说你不知道你的数字是整数还是浮点数......当你使用这个Number类时,编译器也不知道你的数字是整数,浮点数还是其他东西。结果,像+和 - 这样的基本数学运算符不起作用; 计算机不知道如何处理这些值。开始编辑根据讨论,我认为一个例子可能有所帮助。计算机将浮点数存储为两部分,即系数和指数。因此,在理论系统中,001110可能被分解为0011 10或3 2 = 9.但正整数将数字存储为二进制,因此001110也可能意味着2 + 4 + 8 = 14.当您使用该类时Number, '告诉计算机你不知道这个数字是浮点数还是int数或者是什么,所以它知道它有001110但它不知道这是否意味着9或14或其他值。结束编辑你可以做的是做一点假设并转换成其中一种类型进行数学运算。所以你可以拥有Number c = a.intValue() + b.intValue();你可能会变成Integer c = a.intValue() + b.intValue();如果你愿意遭受一些舍入错误,或者Float c = a.floatValue() + b.floatValue();如果您怀疑自己没有处理整数,并且可能会出现轻微的精确问题。或者,如果你宁愿采取一点性能打击而不是那个错误,BigDecimal c = new BigDecimal(a.floatValue()).add(new BigDecimal(b.floatValue()));

一只甜甜圈

它也可以用来为你处理添加的方法。现在我不知道这将导致的性能影响,但我认为它将比使用BigDecimal少。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();    }}

墨色风雨

正确添加任何两种类型的java.lang.Number的唯一方法是:Number a = 2f; // FoatNumber b = 3d; // DoubleNumber c = new BigDecimal( a.toString() ).add( new BigDecimal( b.toString() ) );这甚至适用于具有不同数字类型的两个参数。只要number-type的toString()不降低精度,它(应该?)不会产生任何副作用,如溢出或失去精度。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java