为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

胡子哥哥 2019-09-03 16:21:26
我有两个号码。例如:Number a = 2;Number b = 3;//Following is an error:Number c = a + b;为什么Numbers不支持算术运算?无论如何,我如何在java中添加这两个数字?(当然我从某个地方得到它们,我不知道它们是Integer还是float等)。
查看完整描述

3 回答

?
呼如林

TA贡献1798条经验 获得超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()));



查看完整回答
反对 回复 2019-09-03
?
一只甜甜圈

TA贡献1836条经验 获得超5个赞

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

    }

}


查看完整回答
反对 回复 2019-09-03
?
墨色风雨

TA贡献1853条经验 获得超6个赞

正确添加任何两种类型的java.lang.Number的唯一方法是:


Number a = 2f; // Foat

Number b = 3d; // Double

Number c = new BigDecimal( a.toString() ).add( new BigDecimal( b.toString() ) );

这甚至适用于具有不同数字类型的两个参数。只要number-type的toString()不降低精度,它(应该?)不会产生任何副作用,如溢出或失去精度。


查看完整回答
反对 回复 2019-09-03
  • 3 回答
  • 0 关注
  • 387 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信