亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

java中擴展的雙值問題,我試圖添加兩個雙值但沒有給出準確度

java中擴展的雙值問題,我試圖添加兩個雙值但沒有給出準確度

狐的傳說 2021-12-01 19:43:04
給定的值是雙雙1 = 1.0814449990040142E7;雙雙2 = 7.0164302885665664E17;結果是 double1 + double2 = 7.016430288674711E17 在 Java 中手動計算的值為701643028867471089誰能解決我的問題。
查看完整描述

3 回答

?
倚天杖

TA貢獻1828條經驗 獲得超3個贊

不幸的是,這是一個沒有免費午餐之類的事情。

Double 通過使用緊湊格式來獲得其性能。每個雙精度型正好占據 64 位。這允許在處理器和內存之間進行非常有效的存儲和傳輸,使用寄存器來保存雙精度值,以及算術的硬件實現。BigDecimal 是一種數據結構,其大小取決于所表示的值,但可以遠大于 64 位。

您為 double 的效率付出的代價是它只能精確地表示 BigDecimal 可以精確表示的數字的一個子集。與您的文字最接近的雙精度數是 10814449.9900401420891284942626953125 和 701643028856656640。它們的確切總和是 701643028867471089.94042040216162825261626953125 它本身不是任何雙精度值的確切值。它被雙打 701643028867470976 和 701643028867471104 括起來,其中越接近的就是你得到的結果。

出于許多目的,雙打已經足夠接近了。例如,如果您的變量代表測量的物理量,則測量誤差將使轉換為雙倍時的舍入誤差相形見絀。可以表示為終止小數的數字并不比其他有理數和無理數更重要。在這些情況下,使用雙精度和舍入輸出到輸入精度和累積舍入誤差證明的位數。

其他情況,例如某些財務計算,需要對小數進行精確算術。很少,小數沒有特殊意義,但您需要比 double 可以提供的精度更高的精度。在這兩種情況下,盡管存在性能成本,但 BigDecimal 是正確的數據類型。



查看完整回答
反對 回復 2021-12-01
?
DIEA

TA貢獻1820條經驗 獲得超3個贊

Java 中的雙精度值不準確,您應該使用 BigDecimal 類,它具有更好的精度。

有關更多信息,請參閱文檔:https : //docs.oracle.com/javase/7/docs/api/java/math/BigDecimal.html


查看完整回答
反對 回復 2021-12-01
?
交互式愛情

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);


查看完整回答
反對 回復 2021-12-01
  • 3 回答
  • 0 關注
  • 203 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號