① java丟失精度問題
float a = 3.14;這個語句的意思是把抄雙精度浮點類型(double)賦值給單精度浮點類型(float)的變數a,把一個高精度的數賦值給一個低精度的數,就會照成精度丟失了。因為Java中,3.14這樣的寫法默認是認為double類型的,而3.14f這樣的寫法就會指定3.14這個數為float類型,這樣賦值就不會有精度丟失了。注意,這里你不要單純的把float想像成只能存一位小數點的數,3.14這個數同樣用float可以存下
② JavaScript為什麼浮點數會丟失精度
js浮點計算問題
問題
用js進行浮點數計算,結果可能會「超出預期」,大部分計算結果還是對的,但是我們可不想在計算這么嚴謹的事情上還有意外的驚喜。比如:
0.3 + 0.6 = 0.8999999999999999
0.3 - 0.2 = 0.09999999999999998
0.3 * 1.5 = 0.44999999999999996
0.3 / 0.1 = 2.9999999999999996
看完這幾個計算結果,如果你沒用過js,你可能會有點崩潰。我只能說,這就是js的魅力所在。
分析
在這之前,你需要知道以下幾點:
js中數字類型只有Number;
js的Number是IEEE 754標準的64-bits的雙精度數值
網上有很多關於此問題的解釋,由於計算機是用二進制來存儲和處理數字,不能精確表示浮點數,而js中沒有相應的封裝類來處理浮點數運算,直接計算會導致運算精度丟失。其實高級語言(c#,java)也存在此問題,只不過它們自己內部做了處理,把這種精度差異給屏蔽掉了。有些小數轉換為二進制位數是無窮的(有循環),但是64位中小數最多隻有52位,因此對於位數超過的相當於被截取了,導致了精度的丟失。這個地址可以用來浮點數和IEEE 754標準的64-bits的互轉(背後是二進制的轉換),用這個我們來驗證下0.3-0.2。
0.3轉換後為0.
0.2轉換後為0.
0.-0.=0.
這和js直接計算的結果0.09999999999999998想吻合。
分析下來,終於明白並不是js自身發育不良,只是沒有及時補充營養,我們只能另想出路了。
以上是網上找的
我以前遇到過問題2中瀏覽器計算的結果 是兩種,所以和瀏覽器也有問題
③ js哪些運算精度丟失
由於在H5頁面上需要進行動態的金額計算,且金額涉及到了小數,因而隨之產生了浮點數計算的精度丟失問題。
剛開始的時候,測試給提了一個金額計算誤差的問題,剛開始我還沒怎麼重視,然後瞅了瞅代碼,隨便改了改做了些異常處理,然後就給提交了。
接著,測試又提了一個bug,「6.8-0.9=5.8」。然後頓時我就蒙逼了,隨後突然意識到,JS作為解釋性語言,直接計算會有浮點數精度丟失問題。接下來,在網上找了一些資料,然後也根據具體的原理自己做了一些修改,最終解決了問題。
浮點數的二進製表示:
IEEE 754 標準是IEEE二進位浮點數算術標准(IEEE Standard for Floating-Point Arithmetic)的標准編號,等同於國際標准ISO/IEC/IEEE 60559。該標准由美國電氣電子工程師學會(IEEE)計算機學會旗下的微處理器標准委員會(Microprocessor Standards Committee, MSC)發布。這個標準定義了表示浮點數的格式(包括負零-0)與反常值(denormal number),一些特殊數值(無窮(Inf)與非數值(NaN)),以及這些數值的「浮點數運運算元」;它也指明了四種數值修約規則和五種例外狀況(包括例外發生的時機與處理方式)。
JS的浮點數實現也是遵循IEEE 754標准,採用雙精度存儲(double precision),進行了相關的實現。其中1位用來表示符號位,11位用來表示指數,52位表示尾數。
解決方案:
本質上在處理這類問題的時候,基本的思路就是通過將浮點數轉換成整數進行計算,然後再將整數的小數點位調整,轉回正確的浮點數結果。
④ java float double精度為什麼會丟失
首先有一個觀念,在計算機里所有的數據都是以二進制的形勢保存的。
我們來簡單的舉個例子,
對於int類型的數值我們不陌生, 10進制類型和2進制的轉換也很簡單
比如9= 0000 1001, 22=0001 0110 等
(注意:以下x^y 表示x的y次方)
換一種表示方式 9 = 2^3+2^0,22=2^4+2^2+2^1.很簡單對不對
但是對於float和double類型的數據就變得不一樣了,在清楚為什麼精度會丟失的問題之前還需要先明白一件事
就像在10進制里 0.1 = 10^-1 0.01=10^-2 一樣 在2進制里 小數點後邊的數字也是用2^-n次方來解決的.
那麼問題來了,大家都知道 2^-1 =0.5,2^-2=0.25
如果你想表示0.6的話在10進制里可以簡單的用6*10^-1次方來表示,但是在2進制里怎麼表示呢,?只能用盡可能接近的數據來表示比如 (1*2^-1)+(1*2^-3) 也就是 0.5+0.125 =0.625 約等於0.6 (這里只是舉個例子,實際計算機在存儲的時候要復雜一些),因為在2進制里邊沒有「准確」表示 比如 0.1,0.00000001 這樣數據的2進制數據.
還有一點,操作系統的位數也會影響到float和double的精度,比如32位和64位
(純手打 不明白的話 追問)