亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁技術文章
文章詳情頁

js精準計算

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

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

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

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

我們先把 0.1 和 0.2 轉換成二進制看看:

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

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

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

如何解決呢?

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

/** ** 除法函數(shù),用來得到精確的除法結果 ** 說明:JavaScript的除法結果會有誤差,在兩個浮點數(shù)相除的時候會比較明顯。這個函數(shù)返回較為精確的除法結果。 ** 調用:accdiv(arg1,arg2) ** 返回值:arg1除以arg2的精確結果 **/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ù),用來得到精確的加法結果 ** 說明:javascript的加法結果會有誤差,在兩個浮點數(shù)相加的時候會比較明顯。這個函數(shù)返回較為精確的加法結果。 ** 調用:accAdd(arg1,arg2) ** 返回值:arg1加上arg2的精確結果 **/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ù),用來得到精確的乘法結果 ** 說明:javascript的乘法結果會有誤差,在兩個浮點數(shù)相乘的時候會比較明顯。這個函數(shù)返回較為精確的乘法結果。 ** 調用:accMul(arg1,arg2) ** 返回值:arg1乘以 arg2的精確結果 **/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精準計算的詳細內容,更多關于js精準計算的資料請關注好吧啦網(wǎng)其它相關文章!

標簽: JavaScript
相關文章:
主站蜘蛛池模板: 亚洲高清国产一区二区三区 | 亚洲精品一区二区三区www | 国产a不卡片精品免费观看 国产a毛片高清视 | 午夜视频网站在线观看 | 国产亚洲精品久久久极品美女 | 伊人色综合网一区二区三区 | 欧美爱爱网站 | 亚洲精品午夜在线观看 | 91高清免费视频 | 手机看片国产在线 | 色婷婷久久综合中文久久一本` | 日韩中文字幕高清在线专区 | 性色视频免费 | 国产亚洲自拍一区 | 国产日产亚洲欧美综合另类 | japanesexvideos护士 | 九九精品视频在线 | 欧美大片一区二区三区 | 97日日摸天天碰免费视频 | 国产精品亚洲成在人线 | 精品欧美一区二区三区在线观看 | 日本一级毛片在线播放 | 国产精品视频一区二区三区经 | 毛片在线播放a | 国产999在线 | 亚洲欧美日韩特级毛片 | 欧美国产一区二区二区 | 亚洲精品一区二区在线播放 | 国产免费资源高清小视频在线观看 | se视频在线观看 | er久99久热只有精品国产 | 看免费黄色 | 伊人色在线观看 | 国产亚洲精品日韩综合网 | 日日摸夜夜摸人人嗷嗷叫 | 一级黄网站 | 亚洲精品综合一区在线 | 亚洲国产成人久久笫一页 | 国内自拍视频在线看免费观看 | 久久免费视频3 | 精品一区二区三区影片 |