久久福利_99r_国产日韩在线视频_直接看av的网站_中文欧美日韩_久久一

您的位置:首頁技術(shù)文章
文章詳情頁

js精準(zhǔn)計算

瀏覽:112日期:2024-03-31 15:57:23

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

0.1 + 0.2 = 0.30000000000000004。計算精度誤差問題(和二進(jìn)制相關(guān))。

對于浮點(diǎn)數(shù)的四則運(yùn)算,幾乎所有的編程語言都會有類似精度誤差的問題,只不過在 C++/C#/Java 這些語言中已經(jīng)封裝好了方法來避免精度的問題,而JavaScript是一門弱類型的語言,從設(shè)計思想上就沒有對浮點(diǎn)數(shù)有個嚴(yán)格的數(shù)據(jù)類型,所以精度誤差的問題就顯得格外突出。

我們先把 0.1 和 0.2 轉(zhuǎn)換成二進(jìn)制看看:

0.1 => 0.0001 1001 1001 1001…(無限循環(huán))

0.2 => 0.0011 0011 0011 0011…(無限循環(huán))

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

如何解決呢?

首先將數(shù)乘以10的冪次方去掉小數(shù)位得到可以轉(zhuǎn)化二進(jìn)制的整數(shù),計算之后再還原。

/** ** 除法函數(shù),用來得到精確的除法結(jié)果 ** 說明:JavaScript的除法結(jié)果會有誤差,在兩個浮點(diǎn)數(shù)相除的時候會比較明顯。這個函數(shù)返回較為精確的除法結(jié)果。 ** 調(diào)用:accdiv(arg1,arg2) ** 返回值:arg1除以arg2的精確結(jié)果 **/function accdiv(arg1, arg2) { var t1 = 0, t2 = 0, r1, r2; try {t1 = arg1.toString().split('.')[1].length; } catch (e) { } try {t2 = arg2.toString().split('.')[1].length; } catch (e) { } with (Math) {r1 = Number(arg1.toString().replace('.', ''));r2 = Number(arg2.toString().replace('.', ''));return (r1 / r2) * Math.pow(10, t2 - t1); }}/** ** 加法函數(shù),用來得到精確的加法結(jié)果 ** 說明:javascript的加法結(jié)果會有誤差,在兩個浮點(diǎn)數(shù)相加的時候會比較明顯。這個函數(shù)返回較為精確的加法結(jié)果。 ** 調(diào)用:accAdd(arg1,arg2) ** 返回值:arg1加上arg2的精確結(jié)果 **/function accAdd(arg1, arg2) { var r1, r2, m, c; try {r1 = arg1.toString().split('.')[1].length; } catch (e) {r1 = 0; } try {r2 = arg2.toString().split('.')[1].length; } catch (e) {r2 = 0; } c = Math.abs(r1 - r2); m = Math.pow(10, Math.max(r1, r2)); if (c > 0) {var cm = Math.pow(10, c);if (r1 > r2) { arg1 = Number(arg1.toString().replace('.', '')); arg2 = Number(arg2.toString().replace('.', '')) * cm;} else { arg1 = Number(arg1.toString().replace('.', '')) * cm; arg2 = Number(arg2.toString().replace('.', ''));} } else {arg1 = Number(arg1.toString().replace('.', ''));arg2 = Number(arg2.toString().replace('.', '')); } return (arg1 + arg2) / m;}/** ** 乘法函數(shù),用來得到精確的乘法結(jié)果 ** 說明:javascript的乘法結(jié)果會有誤差,在兩個浮點(diǎn)數(shù)相乘的時候會比較明顯。這個函數(shù)返回較為精確的乘法結(jié)果。 ** 調(diào)用:accMul(arg1,arg2) ** 返回值:arg1乘以 arg2的精確結(jié)果 **/function accMul(arg1, arg2) { var m = 0, s1 = arg1.toString(), s2 = arg2.toString(); try {m += s1.split('.')[1].length; } catch (e) { } try {m += s2.split('.')[1].length; } catch (e) { } return Number(s1.replace('.', '')) * Number(s2.replace('.', '')) / Math.pow(10, m);}

以上就是js精準(zhǔn)計算的詳細(xì)內(nèi)容,更多關(guān)于js精準(zhǔn)計算的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: JavaScript
相關(guān)文章:
主站蜘蛛池模板: 国产精品久久久久久一区二区三区 | 狠狠亚洲 | 欧美一区二区三区在线 | 夜夜骑天天干 | 久草成人 | 人人艹人人 | 国产在线拍揄自揄拍视频 | 亚洲一区在线日韩在线深爱 | 亚洲欧美日韩在线一区二区 | 亚洲伊人久久综合 | 精品99久久 | 青青草一区二区三区 | 久久大陆| 亚洲精品久久久久久久久久久 | 九九国产精品视频 | 亚洲九九精品 | 最新日韩免费 | 国产农村妇女精品一二区 | 日韩在线精品视频 | 日韩欧美在线播放视频 | 成人免费视频网站在线观看 | 亚洲国产精品一区 | 99视频免费看 | 夜夜av| 欧美精品一区久久 | 日韩成人影院 | 亚州国产精品视频 | a级性视频 | 日韩小视频 | 免费中文字幕 | 国产精品久久久麻豆 | 久久久久亚洲一区二区三区 | 国精产品一区二区三区黑人免费看 | 啊v视频 | 一级黄色大片 | 欧洲毛片| 国产精品久久久久久久午夜片 | 五月天婷婷在线视频 | 国产成人精品综合 | 久久精品免费 | 久久99精品国产自在现线 |