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()));
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();
}
}
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()不降低精度,它(应该?)不会产生任何副作用,如溢出或失去精度。
添加回答
举报