Vue中使用js實現保留小數的奇入偶不入,四捨六入的計算

騎熊小白喵發表於2020-12-08

Vue中使用js實現保留小數的奇入偶不入,四捨六入的計算

使用js實現保留小數的奇入偶不入,四捨六入的計算

handleDataUtils.js

/** 處理數值資料:四捨六入奇進偶不進
 * 1,如果取小數的最後一位為5,5前為奇數進位,為偶不進,五後非零就進一,五後皆零看奇偶,五前為偶應捨去,五前為奇要進一
 * 2.5後不為0時就入,為0時看5前,奇進偶不進
 * 3.四舍,六入
 * 傳入數值和保留位數*/
export function handleNumber(number, fixed = 0) {
  number = String(number);
  //可以考慮清掉末尾的0,暫時限制了不會有,因為傳入數值,末尾0是去掉的
  let index = number.indexOf(".");
  if (index == -1) {
    //沒有小數,直接返回
    return number;
  }
  //取到保留小數位的下一位,5.5555取保留倆位,那就是小數點後第三位
  let indexFixed = index + fixed +1;
  if (indexFixed >= number.length) {
    //如果小數位數不夠直接返回
    return number;
  }
  //取保留位數的後一位做判斷,以下是有5的判斷
  let endNumber = number.substr(indexFixed,1);
  if (endNumber != "5") {
    //如果做判斷的數不是五,就按正常的四捨五入,即忽略了5,後面補0的那些由於是數字傳進來,0已經去掉,此處不做處理
    return Number(number).toFixed(fixed);
  }
  if (indexFixed != number.length-1) {
    //由於當前判斷位不是最後一位,而又去除了0,那麼後面後的位數應該直接入位,五後不為0時入,由於會有小於五的,四捨五入肯定不行,那麼只能擷取到當前保留位數,然後轉成數字加上10的負fixed的次方即可
    number = number.substring(0, indexFixed)
    return (Number(number) + Number(Math.pow(10,-fixed))).toFixed(fixed);
    //return this.accAdd(number,Math.pow(10,-fixed))
  }
  //接下來就時五後沒有值也就是0的需要看前面的奇入偶不入了,取當前位的上一位
  let twoNumber = number.substr(indexFixed-1,1);
  if ("13579".indexOf(twoNumber) != -1) {//奇進
    number = number.substring(0, indexFixed)
    return (Number(number) + Math.pow(10,-fixed)).toFixed(fixed);
  }
  //偶不進,將取值的當前位數,直接擷取字元即可
  return number.substr(0,indexFixed);
}

注意:傳入的引數一定是數值,否則字串可能造成是末尾有0,此處傳入數值小數位末尾0會抹去
注意:倆數直接相加丟失了精度,此處因為丟失的精度後數值度為9,所以直接取保留位數即可。倆數相減也會丟失精度,數值度為0所以用.toFixed也一樣可以
注意:number.substr(第幾位開始,取幾位);,從零開始算
注意:number.substring(從第幾位, 到第幾位);,從零開始算
注意:Number(number).toFixed(保留的小數位數);這個方法應該是四捨六入不包含五。

如何使用

匯入

import { handleNumber } from '@/utils/handleDataUtils';

使用

methods: {
      /** 計算*/
      count() {
        setTimeout(()=>{
          this.count_1();
        },10)
      },
      /**計算*/
      count_1() {
        //(L1-L)/L0 * 100
        let l0 = this.form.getFieldValue('datumLength');
        let l_1 = this.form.getFieldValue('result1');
        let l1_1 = this.form.getFieldValue('result4');
        if ((Number(l0) != 0) &&this.isValuable(l0) && this.isValuable(l_1) && this.isValuable(l1_1)) {
          this.form.setFieldsValue({
            "result5": handleNumber(Number((Number(l1_1) - Number(l_1)) / Number(l0) * 100), 3)
          })
        }
      },
}

相關文章