3 回答

TA貢獻1828條經驗 獲得超3個贊
不幸的是,這是一個沒有免費午餐之類的事情。
Double 通過使用緊湊格式來獲得其性能。每個雙精度型正好占據 64 位。這允許在處理器和內存之間進行非常有效的存儲和傳輸,使用寄存器來保存雙精度值,以及算術的硬件實現。BigDecimal 是一種數據結構,其大小取決于所表示的值,但可以遠大于 64 位。
您為 double 的效率付出的代價是它只能精確地表示 BigDecimal 可以精確表示的數字的一個子集。與您的文字最接近的雙精度數是 10814449.9900401420891284942626953125 和 701643028856656640。它們的確切總和是 701643028867471089.94042040216162825261626953125 它本身不是任何雙精度值的確切值。它被雙打 701643028867470976 和 701643028867471104 括起來,其中越接近的就是你得到的結果。
出于許多目的,雙打已經足夠接近了。例如,如果您的變量代表測量的物理量,則測量誤差將使轉換為雙倍時的舍入誤差相形見絀。可以表示為終止小數的數字并不比其他有理數和無理數更重要。在這些情況下,使用雙精度和舍入輸出到輸入精度和累積舍入誤差證明的位數。
其他情況,例如某些財務計算,需要對小數進行精確算術。很少,小數沒有特殊意義,但您需要比 double 可以提供的精度更高的精度。在這兩種情況下,盡管存在性能成本,但 BigDecimal 是正確的數據類型。

TA貢獻1820條經驗 獲得超3個贊
Java 中的雙精度值不準確,您應該使用 BigDecimal 類,它具有更好的精度。
有關更多信息,請參閱文檔:https : //docs.oracle.com/javase/7/docs/api/java/math/BigDecimal.html

TA貢獻1712條經驗 獲得超3個贊
只需按照您想要的方式對其進行格式化
double double1 = 1.0814449990040142E7;
double double2 = 7.0164302885665664E17;
System.out.printf("%.2f", double1 + double2);
輸出701643028867471100.00
或者
System.out.printf("%.0f", double1 + double2);
添加回答
舉報