国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

javascript中0.1 + 0.2 != 0.3?

ivydom / 3382人閱讀

摘要:按照的數(shù)字格式,整數(shù)有的范圍是,而且只能表示有限個浮點數(shù),能表示的個數(shù)為個。

0.1+0.2 等于0.3嗎?相信拿著這條題目隨便問一個高年級的小學生,他們都會毫不猶豫都回答:相等。是的,相等是正常的,這是常識。但是都說實踐是檢驗真理的唯一標準,拿這道簡單的算術題用javascript在chrome控制臺試驗一下:

結果令人大跌眼鏡,在控制臺輸入0.1+0.2 == 0.3返回的結果竟然是false!!!!我們輸入0.1+0.2,看看結果,竟然是0.30000000000000004

這是為什么呢?在《Javascript權威指南》中有提到,JS是不區(qū)分整數(shù)和浮點數(shù)的,JS采用的是IEEE 754標準定義的64位浮點格式表示數(shù)字,所以JS中的所有數(shù)字都是浮點數(shù)。按照JS的數(shù)字格式,整數(shù)有的范圍是-2^53 ~ 2^53,而且只能表示有限個浮點數(shù),能表示的個數(shù)為2^64 ? 2^53 + 3個。至于為什么是這個范圍,可以具體看看《JavaScript 中的數(shù)字》這篇文章也解下。而我們都知道,浮點數(shù)的個數(shù)是無限的,這就導致了JS不能精確表達所有的浮點數(shù),而只能是一個近似值。

那怎樣才能比較0.1+0.2 == 0.3呢?既然浮點數(shù)是一個近似值,那我們可以認定在某個可以接受的精度范圍內,他們是相等的。因此可以定義一個比較函數(shù)來比較浮點數(shù)。

function isFloatEqual(f1,f2,digits) {
    return f1.toFixed(digits) === f2.toFixed(digits);
} 
isFloatEqual(0.1+0.2,0.3,10);   //  返回true

可以看到,這時再比較0.1+0.2就與0.3相等了。這種比較,其實是字符串的比較,toFixed方法,返回的是一個字符串。可以在控制臺中輸入:

0.1.toFixed(1)+0.2.toFixed(1)

你會發(fā)現(xiàn),返回的結果是"0.10.2"

這種方法解決了0.1+0.2==0.3的問題,但是當我用isFloatEqual(0.3 - 0.2,0.1,10)的時候,發(fā)覺返回的值是false,這又是為什么呢?

原來0.3 - 0.2計算出來的是0.09999999999999998,上面的方法只能覆蓋到計算結果比實際結果大的情況,而對于小的情況無能為力。

我們知道,當兩個數(shù)相減,如果差在約定的精度范圍內,我們就可以認為這兩個數(shù)相等,根據(jù)這個原理,再來重寫isFloatEqual函數(shù),如下:

function isFloatEqual(f1,f2,digits) {
    return Math.abs(f1 - f2) < digits;
} 
isFloatEqual(0.1+0.2,0.3,0.001);   // true
isFloatEqual(0.3-0.2,0.1,0.001); // true

那除了上面的方法外,能不能讓JS在做加減法的時候精確一點呢?

我們知道,只要在-2^53 ~ 2^53的范圍內,JS做整數(shù)的加減運算是精確的,那么我們是不是可以將浮點數(shù)轉換為整數(shù),再進行運算呢?按照這個思路,在《淺談JavaScript浮點數(shù)及其運算》這篇文章中,提供了一種方法,將代碼粘貼如下:

function accAdd(arg1,arg2){
  var r1,r2,m;
  try{r1=arg1.toString().split(".")[1].length}catch(e){r1=0}
  try{r2=arg2.toString().split(".")[1].length}catch(e){r2=0}
  m=Math.pow(10,Math.max(r1,r2))
  return (arg1*m+arg2*m)/m
}

這種方法是先計算出兩個浮點數(shù)的小數(shù)位數(shù)n,兩個參數(shù)再分別與10^n(放大倍數(shù))相乘,以達到對兩個參數(shù)取整的目的,再用整數(shù)來進行相加運算,加完后除掉放大的倍數(shù)就可以得出結果了。

現(xiàn)在用accAdd(0.1,0.2),返回的結果是0.3了,但是評論里面馬上有人提出accAdd(2.22,0.1) 的結果不是2.32,而是2.3200000000000003。原來在做arg1*m這一步時,依舊是浮點數(shù)運算,所以返回的結果不一定是整數(shù),依舊是浮點數(shù)。

我看到作者在做減法的時候用了toFixed(),如果用toFixed(n)是不是就可以了呢?來試一下,函數(shù)改造成這樣:

function accAdd(arg1,arg2){
      var r1,r2,n,m;
      try{r1=arg1.toString().split(".")[1].length}catch(e){r1=0}
      try{r2=arg2.toString().split(".")[1].length}catch(e){r2=0}
      n = Math.max(r1,r2);
      m=Math.pow(10,n);
      return ((arg1*m+arg2*m)/m).toFixed(n)
    }

這次再調用accAdd(2.22,0.1)時,返回的是2.32了,完美!

但是手賤試了下accAdd(2.22,0.08),返回的結果是2.30,而我期望返回的結果是2.3。上文已經提到過,toFixed返回的是一個字符串,所以用toFixed返回2.30看來是正常的了。那如果要返回2.3要怎樣做呢?

其實很簡單,用parseInt將arg1*m轉換為整數(shù)就可以了。

function accAdd(arg1,arg2){
      var r1,r2,m;
      try{r1=arg1.toString().split(".")[1].length}catch(e){r1=0}
      try{r2=arg2.toString().split(".")[1].length}catch(e){r2=0}
      m=Math.pow(10,Math.max(r1,r2))
      return (parseInt(arg1*m,10)+parseInt(arg2*m,10))/m
    }
參考文章

JavaScript 中的數(shù)字

淺談JavaScript浮點數(shù)及其運算

What Every JavaScript Developer Should Know About Floating Points

近期在看《javascript權威指南》,邊看邊總結,都會同步發(fā)送到微信公眾號上,歡迎關注,歡迎提意見:

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/91050.html

相關文章

  • 0.1 + 0.2 != 0.3背后的原理

    摘要:標準是浮點數(shù)算術標準的標準編號,等同于國際標準。標準規(guī)定了計算機程序設計環(huán)境中的二進制和十進制的浮點數(shù)之間的交換算術格式以及方法。 初學JavaScript,在進行小數(shù)(浮點數(shù))運算時,經常會碰到這樣的情況:0.1 + 0.2=0.30000000000000004,記得當時,教程告訴我們說,0.1 + 0.2在JavaScript運算中,它的值是不固定的,可以在后面學習和試驗中,漸漸...

    阿羅 評論0 收藏0
  • 如何解決0.1 +0.2===0.30000000000000004類問題

    摘要:方法使用定點表示法來格式化一個數(shù),會對結果進行四舍五入。該數(shù)值在必要時進行四舍五入,另外在必要時會用來填充小數(shù)部分,以便小數(shù)部分有指定的位數(shù)。如果數(shù)值大于,該方法會簡單調用并返回一個指數(shù)記數(shù)法格式的字符串。在環(huán)境中,只能是之間,測試版本為。 showImg(https://segmentfault.com/img/remote/1460000011913134?w=768&h=521)...

    yuanzhanghu 評論0 收藏0
  • 為什么JavaScript里面0.1+0.2 === 0.3是false

    摘要:返回是,這是為什么呢我們知道浮點數(shù)計算是不精確的,上面的返回式實際上是這樣的在的新規(guī)范加入了一個新的東西是在對象上面,新增一個極小的常量。根據(jù)規(guī)格,它表示與大于的最小浮點數(shù)之間的差。上面的代碼為浮點數(shù)運算,部署了一個誤差檢查函數(shù)。 0.1+0.2 === 0.3 //返回是false, 這是為什么呢?? 我們知道浮點數(shù)計算是不精確的,上面的返回式實際上是這樣的:0.1 + 0.2 = ...

    nicercode 評論0 收藏0
  • 一個函數(shù)讓你看懂 'Why 0.1+0.2!=0.3'

    摘要:的二進制科學計數(shù)法第位是,所以就有了下面的結果有著同樣的問題,其實正是由于這樣的存儲,在這里有了精度丟失,導致了。最大安全數(shù)字中表示最大安全數(shù)字計算結果是,即在這個數(shù)范圍內不會出現(xiàn)精度丟失小數(shù)除外這個數(shù)實際上是。是一個任意精度的整數(shù)。 話不多說,先上代碼 function judgeFloat(n, m) { const binaryN = n.toString(2...

    mushang 評論0 收藏0
  • JavaScript浮點運算0.2+0.1 !== 0.3

    摘要:標準二進制浮點數(shù)算法就是一個對實數(shù)進行計算機編碼的標準。然后把取出的整數(shù)部分按順序排列起來,先取的整數(shù)作為二進制小數(shù)的高位有效位,后取的整數(shù)作為低位有效位。 浮點運算JavaScript 本文主要討論JavaScript的浮點運算,主要包括 JavaScript number基本類型 二進制表示十進制 浮點數(shù)的精度 number 數(shù)字類型 在JavaScript中,數(shù)字只有numb...

    iflove 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<