3 回答

TA貢獻(xiàn)1798條經(jīng)驗(yàn) 獲得超3個(gè)贊
你說(shuō)你不知道你的數(shù)字是整數(shù)還是浮點(diǎn)數(shù)......當(dāng)你使用這個(gè)Number類(lèi)時(shí),編譯器也不知道你的數(shù)字是整數(shù),浮點(diǎn)數(shù)還是其他東西。結(jié)果,像+和 - 這樣的基本數(shù)學(xué)運(yùn)算符不起作用; 計(jì)算機(jī)不知道如何處理這些值。
開(kāi)始編輯
根據(jù)討論,我認(rèn)為一個(gè)例子可能有所幫助。計(jì)算機(jī)將浮點(diǎn)數(shù)存儲(chǔ)為兩部分,即系數(shù)和指數(shù)。因此,在理論系統(tǒng)中,001110可能被分解為0011 10或3 2 = 9.但正整數(shù)將數(shù)字存儲(chǔ)為二進(jìn)制,因此001110也可能意味著2 + 4 + 8 = 14.當(dāng)您使用該類(lèi)時(shí)Number, '告訴計(jì)算機(jī)你不知道這個(gè)數(shù)字是浮點(diǎn)數(shù)還是int數(shù)或者是什么,所以它知道它有001110但它不知道這是否意味著9或14或其他值。
結(jié)束編輯
你可以做的是做一點(diǎn)假設(shè)并轉(zhuǎn)換成其中一種類(lèi)型進(jìn)行數(shù)學(xué)運(yùn)算。所以你可以擁有
Number c = a.intValue() + b.intValue();
你可能會(huì)變成
Integer c = a.intValue() + b.intValue();
如果你愿意遭受一些舍入錯(cuò)誤,或者
Float c = a.floatValue() + b.floatValue();
如果您懷疑自己沒(méi)有處理整數(shù),并且可能會(huì)出現(xiàn)輕微的精確問(wèn)題。或者,如果你寧愿采取一點(diǎn)性能打擊而不是那個(gè)錯(cuò)誤,
BigDecimal c = new BigDecimal(a.floatValue()).add(new BigDecimal(b.floatValue()));

TA貢獻(xiàn)1836條經(jīng)驗(yàn) 獲得超5個(gè)贊
它也可以用來(lái)為你處理添加的方法?,F(xiàn)在我不知道這將導(dǎo)致的性能影響,但我認(rèn)為它將比使用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貢獻(xiàn)1853條經(jīng)驗(yàn) 獲得超6個(gè)贊
正確添加任何兩種類(lèi)型的java.lang.Number的唯一方法是:
Number a = 2f; // Foat
Number b = 3d; // Double
Number c = new BigDecimal( a.toString() ).add( new BigDecimal( b.toString() ) );
這甚至適用于具有不同數(shù)字類(lèi)型的兩個(gè)參數(shù)。只要number-type的toString()不降低精度,它(應(yīng)該?)不會(huì)產(chǎn)生任何副作用,如溢出或失去精度。
添加回答
舉報(bào)