亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

javascript避免數字計算精度誤差的方法詳解

2019-11-20 20:59:59
字體:
來源:轉載
供稿:網友

如果我問你 0.1 + 0.2 等于幾?你可能會送我一個白眼,0.1 + 0.2 = 0.3 啊,那還用問嗎?連幼兒園的小朋友都會回答這么小兒科的問題了。但是你知道嗎,同樣的問題放在編程語言中,或許就不是想象中那么簡單的事兒了。
不信?我們先來看一段 JS。

var numA = 0.1;
var numB = 0.2;
alert( (numA + numB) === 0.3 );

執行結果是 false。沒錯,當我第一次看到這段代碼時,我也理所當然地以為它是 true,但是執行結果讓我大跌眼鏡,是我的打開方式不對嗎?非也非也。我們再執行以下代碼試試就知道結果為什么是 false 了。

var numA = 0.1;
var numB = 0.2;
alert( numA + numB );

原來,0.1 + 0.2 = 0.30000000000000004。是不是很奇葩?其實對于浮點數的四則運算,幾乎所有的編程語言都會有類似精度誤差的問題,只不過在 C++/C#/Java 這些語言中已經封裝好了方法來避免精度的問題,而 JavaScript 是一門弱類型的語言,從設計思想上就沒有對浮點數有個嚴格的數據類型,所以精度誤差的問題就顯得格外突出。下面就分析下為什么會有這個精度誤差,以及怎樣修復這個誤差。

首先,我們要站在計算機的角度思考 0.1 + 0.2 這個看似小兒科的問題。我們知道,能被計算機讀懂的是二進制,而不是十進制,所以我們先把 0.1 和 0.2 轉換成二進制看看:

0.1 => 0.0001 1001 1001 1001…(無限循環)
0.2 => 0.0011 0011 0011 0011…(無限循環)

雙精度浮點數的小數部分最多支持 52 位,所以兩者相加之后得到這么一串 0.0100110011001100110011001100110011001100110011001100 因浮點數小數位的限制而截斷的二進制數字,這時候,我們再把它轉換為十進制,就成了 0.30000000000000004。

原來如此,那怎么解決這個問題呢?我想要的結果就是 0.1 + 0.2 === 0.3 ?。。?!

有種最簡單的解決方案,就是給出明確的精度要求,在返回值的過程中,計算機會自動四舍五入,比如:

var numA = 0.1;
var numB = 0.2;
alert( parseFloat((numA + numB).toFixed(2)) === 0.3 );

但是明顯這不是一勞永逸的方法,如果有一個方法能幫我們解決這些浮點數的精度問題,那該多好。我們來試試下面這個方法:

Math.formatFloat = function(f, digit) {
    var m = Math.pow(10, digit);
    return parseInt(f * m, 10) / m;
}

var numA = 0.1;
var numB = 0.2;

alert(Math.formatFloat(numA + numB, 1) === 0.3);

這個方法是什么意思呢?為了避免產生精度差異,我們要把需要計算的數字乘以 10 的 n 次冪,換算成計算機能夠精確識別的整數,然后再除以 10 的 n 次冪,大部分編程語言都是這樣處理精度差異的,我們就借用過來處理一下 JS 中的浮點數精度誤差。

如果下次再有人問你 0.1 + 0.2 等于幾,你可要小心回答咯??!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
久久久久久久一区二区| 性欧美亚洲xxxx乳在线观看| 一区二区欧美亚洲| 久久久91精品国产一区不卡| 国产日韩av在线| 日韩电影中文字幕在线观看| 黑人巨大精品欧美一区二区一视频| 日产日韩在线亚洲欧美| 欧美精品久久一区二区| 人人澡人人澡人人看欧美| 4p变态网欧美系列| 国产精品成人久久久久| 国产精品久久久久久搜索| 亚洲韩国日本中文字幕| 狠狠躁天天躁日日躁欧美| 欧美另类99xxxxx| 日韩av在线免费观看一区| 国产精品久在线观看| 国产精品99久久99久久久二8| 91麻豆国产语对白在线观看| 91探花福利精品国产自产在线| 亚洲欧美日韩国产精品| 日韩国产高清视频在线| 久久亚洲综合国产精品99麻豆精品福利| 国产精品久久色| 国产精品视频公开费视频| 北条麻妃一区二区三区中文字幕| 欧美专区日韩视频| 亚洲电影成人av99爱色| 91爱爱小视频k| 国产成人精品久久二区二区91| 亚洲欧美中文字幕在线一区| 国产精品99久久久久久久久| 狠狠色狠狠色综合日日小说| 成人免费观看49www在线观看| 欧美—级a级欧美特级ar全黄| 亚洲黄色av女优在线观看| 性欧美xxxx交| 久久亚洲精品小早川怜子66| 亚洲新声在线观看| 国产精品久久久久免费a∨| 日韩va亚洲va欧洲va国产| 日韩中文在线中文网三级| 久久九九有精品国产23| 国产精品高清在线观看| 性色av一区二区三区| 免费99精品国产自在在线| 欧美亚洲国产日本| 欧美日韩精品在线视频| 亚洲国产精品va在看黑人| 欧美日韩在线免费观看| 久久精品视频导航| 国产午夜精品视频免费不卡69堂| 日韩美女av在线| 九九精品在线视频| 日韩欧美中文第一页| 亚洲国产日韩欧美在线动漫| 亚洲日韩欧美视频一区| 亚洲a级在线播放观看| 2019中文字幕免费视频| 97精品国产aⅴ7777| 亚洲午夜av电影| 亚洲成年人在线| 美女性感视频久久久| 97视频在线观看视频免费视频| 国产精品美女久久久久久免费| 亚洲天堂网站在线观看视频| 国产成人极品视频| 97精品伊人久久久大香线蕉| 欧美一乱一性一交一视频| 精品中文视频在线| 国产美女被下药99| 国产精品自拍网| 精品久久久香蕉免费精品视频| 欧美在线激情视频| 国产精品电影观看| 91精品在线影院| 亚洲福利在线看| 欧美激情xxxxx| 91精品国产高清久久久久久| 在线精品91av| 国产欧美日韩最新| 欧美性感美女h网站在线观看免费| 九九热精品视频| 草民午夜欧美限制a级福利片| 亚洲视频网站在线观看| 美女扒开尿口让男人操亚洲视频网站| 久久精品亚洲一区| 日韩精品在线视频美女| 久久婷婷国产麻豆91天堂| 亚洲剧情一区二区| 欧美激情亚洲国产| 欧美丰满片xxx777| 亚洲新中文字幕| 成人乱色短篇合集| 欧美疯狂性受xxxxx另类| 国产成人a亚洲精品| 尤物九九久久国产精品的特点| 浅井舞香一区二区| 高清日韩电视剧大全免费播放在线观看| 91在线播放国产| 91亚洲国产成人精品性色| 亚洲国产精品高清久久久| 日韩中文字幕免费看| 青青精品视频播放| 蜜臀久久99精品久久久久久宅男| 欧美日韩一区二区三区在线免费观看| 狠狠久久五月精品中文字幕| 欧美高清视频在线播放| 日韩美女视频在线观看| 色哟哟网站入口亚洲精品| 日韩av大片在线| 久久久精品国产| 亚洲iv一区二区三区| 欧美理论在线观看| 在线观看欧美视频| 欧美日在线观看| 久久久成人精品视频| 亚洲aa在线观看| 亚洲在线第一页| 日韩精品在线免费观看视频| 国模吧一区二区| 欧美激情国内偷拍| 中文字幕欧美精品日韩中文字幕| 亚洲欧美日韩天堂| 欧美国产日韩视频| 欧美激情a在线| 久久综合亚洲社区| 91精品国产沙发| 日韩中文在线不卡| 国产午夜精品麻豆| 日产精品99久久久久久| 欧美又大粗又爽又黄大片视频| 亚洲精品成人网| 日韩av网站大全| 国产精品久久久久影院日本| 国产在线播放不卡| 8090成年在线看片午夜| 欧美性猛交xxxx免费看久久久| 国产精品久久久久久搜索| 亚洲精品美女在线| 欧美日韩国内自拍| 日韩av大片在线| 成人激情免费在线| 色一区av在线| 国产精品亚洲аv天堂网| 91免费综合在线| 久青草国产97香蕉在线视频| 亚洲激情在线观看| 日韩电影在线观看中文字幕| 欧美日韩精品国产| 亚洲精品国产suv| 欧美自拍视频在线观看| 一区二区三区四区精品| 爱福利视频一区| 国产美女久久精品香蕉69| 国产精品视频免费在线观看| 国产suv精品一区二区三区88区| 国产精品爽爽爽| 日本午夜精品理论片a级appf发布| 亚洲日本欧美中文幕| 日韩精品视频中文在线观看| 国产一区二区三区日韩欧美| 国产成人黄色av|