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

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

Java程序中奇怪的浮點行為

Java程序中奇怪的浮點行為

侃侃爾雅 2019-07-22 10:05:32
Java程序中奇怪的浮點行為在我的程序中,我有一個具有25個雙值0.04的數組,當我試圖在循環中對這些值進行求和時,我得到以下結果:0.0 + 0.04 = 0.040.04 + 0.04 = 0.080.08 + 0.04 = 0.120.12 + 0.04 = 0.160.16 + 0.04 = 0.20.2 + 0.04 = 0.240000000000000020.24000000000000002 + 0.04 = 0.280.28 + 0.04 = 0.320.32 + 0.04 = 0.360.36 + 0.04 = 0.399999999999999970.39999999999999997 + 0.04 = 0.439999999999999950.43999999999999995 + 0.04 = 0.47999999999999990.4799999999999999 + 0.04 = 0.51999999999999990.5199999999999999 + 0.04 = 0.55999999999999990.5599999999999999 + 0.04 = 0.60.6 + 0.04 = 0.640.64 + 0.04 = 0.680.68 + 0.04 = 0.72000000000000010.7200000000000001 + 0.04 = 0.76000000000000010.7600000000000001 + 0.04 = 0.80000000000000020.8000000000000002 + 0.04 = 0.84000000000000020.8400000000000002 + 0.04 = 0.88000000000000020.8800000000000002 + 0.04 = 0.92000000000000030.9200000000000003 + 0.04 = 0.9600000000000003為什么會發生這種事?!
查看完整描述

3 回答

?
守候你守候我

TA貢獻1802條經驗 獲得超10個贊

程序語言中浮點值最常見的存儲-IEEE單打和雙打-對大多數十進制分數沒有精確的表示。

原因是它們以二進制浮點格式存儲值,而不是十進制浮點格式。唯一能精確表示的分數值是2的負冪和。數字如下:

  • 0.5 (2^-1)

  • 0.125 (2^-3)

  • 0.625 (2^-1 + 2^-3)

等。

你所看到的是,像0.96這樣的數字的表示并不完全是可表示的,因為它們不能用2的負冪之和來表示。因此,當以十進制小數的形式以完全精確的方式打印出來時,它們將與原始值不匹配。


查看完整回答
反對 回復 2019-07-22
?
慕斯709654

TA貢獻1840條經驗 獲得超5個贊

查看完整回答
反對 回復 2019-07-22
?
浮云間

TA貢獻1829條經驗 獲得超4個贊

其他答案提到了原因,但沒有提到如何避免。

有幾種解決辦法:

  • 縮放:如果您的所有數字都是0.01的倍數(例如),那么將所有數據乘以100,并使用整數算術(這是精確的)。
  • 數字類型:如果語言具有數字類型(類似于

    numeric

    輸入SQL),您可以使用它。
  • 任意精確理據:使用bignum庫,如

    GMP

    ,它允許您將這些數字表示為兩個整數的比率。
  • 小數點浮點數:如果您有十進制浮點數,如

    IEEE-754 r

    你可以用它。


查看完整回答
反對 回復 2019-07-22
  • 3 回答
  • 0 關注
  • 732 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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