回覆列表
  • 1 # 使用者5400346714740

    很簡單,從二進位制角度考慮問題即可:把「0.1」轉成二進位制的表示,然後還原成十進位制,就能看出問題。一、把 0.1 轉成二進位制表示

    我們知道 DEC(1) 就是 BIN(1),但是 DEC(0.1) 怎麼轉換成二進位制?對了!用除法:0.1 = 1 ÷ 10很簡單,二進位制就是要算1 ÷ 1010我們回到小學的課堂,來列豎式吧:相信上過小學的你一定會發現,除不盡,除出了一個無限迴圈小數:二進位制的 0.0001100110011...二、舍入我們得把 0.0001100110011... 放進一個 double「雙精度浮點數」裡面雙精度浮點數能表示多少精度呢?檢視文件會發現:半精度(16bit):11 位有效數字單精度(32bit):24 位有效數字雙精度(64bit):53 位有效數字四精度(128bit):113 位有效數字好吧,雙精度是 53 位有效數字方便起見,我在第 53 個有效數字後面加了個空格。那麼問題來了:十進位制數我們可以四捨五入,二進位制怎麼辦?精神是一樣的:待處理部分有沒有達到前一位的一半,達到就進位,沒達到就捨去。(暫且當作 0 舍 1 入。)那麼我們的 0.1 在 double 中就是而 1.1 就是三、加法這個很簡單,1.1 + 0.1 就是因為結果仍然是 double,需要再做一次保留 53 位有效數字和舍入:四、結果好了,終於可以回到十進位制的世界了,我們把最終結果轉換回來:得到十進位制的:一般的輸出函式,在輸出浮點數時,都會限制顯示的有效數字,即會再做一次四捨五入。題目中的 1.2000000000000002 是這個結果在顯示時四捨五入後的結果。---正經答題:1.2000000000000002 的原理上面已經一步步分析了。至於各個語言之間的差異,答案是可能會有,比如可能因為選擇的舍入規則的不同可能導致的結果的不同;甚至有可能某個語言裡的浮點數壓根不是 IEEE 754 的浮點數,而是以字串方式儲存的,所以可能沒有誤差。

  • 中秋節和大豐收的關聯?
  • 如何利用針刺療法來治療脫髮?