<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          toFixed 函數(shù)引起的 bug

          共 2680字,需瀏覽 6分鐘

           ·

          2021-04-03 21:21


          (給程序員成長(zhǎng)指北加星標(biāo),提升前端技能

          轉(zhuǎn)自:掘金 -  紅塵煉心

          https://juejin.cn/post/6927215610552123406

          前言

          某天,客服告訴我,有客戶投訴,說(shuō)賬單金額數(shù)據(jù)統(tǒng)計(jì)不對(duì),同時(shí)測(cè)試也反饋在IE11瀏覽器上又是正確的。

          經(jīng)過(guò)排查發(fā)現(xiàn)是toFixed()引起的。

          緣由

          來(lái)看一下toFixed()在chrome、火狐、IE下的不同表現(xiàn)。

          chrome:

          火狐:

          IE:

          可以看到toFixed()的四舍五入在chrome、火狐上并不準(zhǔn)確。

          toFixed()在chrome、火狐上也并不是網(wǎng)上所說(shuō)的用銀行家舍入法來(lái)進(jìn)行四舍五入的。

          銀行家舍入法的規(guī)則是“四舍六入五考慮,五后非零就進(jìn)一,五后為零看奇偶,五前為偶應(yīng)舍去,五前為奇要進(jìn)一”。

          例如銀行家舍入法在 (2.55).toFixed(1) = 2.5(3.55).toFixed(1) = 3.5 上就不符合了。

          那為什么會(huì)這樣呢,要從toFixed的定義說(shuō)起,來(lái)看ecmascript 規(guī)范對(duì)toFixed的表述:

          按上圖中的步驟來(lái)演示一下(2.55).toFixed(1) = 2.5的處理過(guò)程。

          x為2.55,小于,f為1,要使準(zhǔn)確的數(shù)學(xué)值盡可能接近零,取n為25和n為26,

          可以看到最接近零的應(yīng)該是 -0.04999... ,故n為25,那么m為25,k為2, 為1,故a為2,則b為5,所以(2.55).toFixed(1)的結(jié)果為2.5??梢钥闯?code style="font-size: 14px;font-family: 'Operator Mono', Consolas, Monaco, Menlo, monospace;word-break: break-all;overflow-wrap: break-word;padding: 2px 4px;border-radius: 4px;margin-right: 2px;margin-left: 2px;color: rgb(233, 105, 0);background: rgb(248, 248, 248);">(2.55).toFixed(1)的結(jié)果是2.5而不是2.6,是... 引起,而為什么不等于0.5,其原因和不等0.3是一樣,可以看我這篇專欄《非科班前端人的一道送命題:0.1+0.2 等于 0.3 嗎?》。

          但是在IE瀏覽器中,執(zhí)行 的結(jié)果和在chrome和火狐瀏覽器中執(zhí)行的結(jié)果是一樣。這里只能推斷IE瀏覽器中定義的toFixed不符合ecmascript 規(guī)范,具體原因目前也不清楚,如果知道的同學(xué)可以在評(píng)論中留言,謝謝。


          解決


          假設(shè)要四舍五入的數(shù)字為number,要保留n位小數(shù),可以先用 ,然后用 Math.round()取整,最后在除去,間接實(shí)現(xiàn)四舍五入。另外toFixed()還有個(gè)自動(dòng)補(bǔ)零的功能,也要實(shí)現(xiàn)一下,故下面簡(jiǎn)單封裝了一個(gè)toFixed方法來(lái)實(shí)現(xiàn)四舍五入。

          function toFixed(number, m) {
              if (typeof number !== 'number') {
                  throw new Error("number不是數(shù)字");
              }
              let result = Math.round(Math.pow(10, m) * number) / Math.pow(10, m);
              result = String(result);
              if (result.indexOf(".") == -1) {
                  if(m != 0){
                      result += ".";
                      result += new Array(m + 1).join('0');
                  }
              } else {
                  let arr = result.split('.');
                  if (arr[1].length < m) {
                      arr[1] += new Array(m - arr[1].length + 1).join('0')
                  }
                  result = arr.join('.')
              }
              return result
          }
          ??愛(ài)心三連擊

          1.看到這里了就點(diǎn)個(gè)在看支持下吧,你的點(diǎn)贊,在看是我創(chuàng)作的動(dòng)力。

          2.關(guān)注公眾號(hào)程序員成長(zhǎng)指北,回復(fù)「1」加入高級(jí)前端交流群!「在這里有好多 前端 開(kāi)發(fā)者,會(huì)討論 前端 Node 知識(shí),互相學(xué)習(xí)」!

          3.也可添加微信【ikoala520】,一起成長(zhǎng)。


          “在看轉(zhuǎn)發(fā)”是最大的支持

          瀏覽 46
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  国产一级视频 | 久久久毛片 | 99久久久无码国产精品性波多 | 亚洲欧美国产操逼 | 天天操天天操 |