La somme des ratios de prix de vérification de toutes les lignes de la règle de vérification du formulaire est 1 (problème de perte de précision)

 L'effet de vérification normal est le suivant (code modifié)

 

Le blogueur a rencontré un petit problème, mais a pensé qu'il pouvait être enregistré pour éviter d'autres pièges à l'avenir. J'étais très confus lorsque la somme était déjà de 1.

Comme le montre l'image, j'ai créé une petite fonction. La colonne du rapport de prix vérifie les lignes où la somme de toutes les lignes est de 1.

 

Le code de la règle de vérification est le suivant

Écrit en calcul est de déclencher la mise à jour de la règle de vérification lors du remplissage en temps réel pour vérifier si elle est correcte.

  computed: {
    rules() {
      var testValid = (rule, value, callback) => {
        if (value <= 0) {
          return callback(new Error('不能填写小于等于0的数据'))
        }
        let flag = false
        let countArr = []
        if (this.list && this.list.length > 0) {
          this.list.forEach((item) => {
            if (item.priceRatio) {
              countArr.push(item.priceRatio)
            }
          })
        }

        const sum = (num) => {
          let i = 0,
            result = 0
          while (i < num.length) {
            result += Number(num[i])
            i++
          }
          return result
        }
        const sumlength = (num) => {
          let i = 0

          while (i < num.length) {
            i++
          }
          return i
        }
        let count = sum(countArr)
        let currentLength = sumlength(countArr)
        console.log('currentLength', currentLength)
        console.log('count', count)
        if ((count != 1 && currentLength == this.list.length) || count > 1) {
          flag = true
        }
        if (flag) {
          callback(new Error('价格比例相加不等于1'))
        } else {
          this.$refs['tabs'].clearTableValidate()
          callback()
        }
      }
      return {
        // 主表表单校验规则
        goodsCode: [
          { required: true, message: '此项为必填项', trigger: 'blur' },
        ],
        priceRatio: [
          {
            required: this.isRequired,
            message: '此项为必填项',
            trigger: ['blur', 'change'],
          },
          {
            validator: this.isRequired ? testValid : '',
            trigger: ['blur', 'change'],
          },
        ],
        giftQuantity: [
          { required: false, trigger: 'blur' },
          {
            pattern: /^([1-9][0-9]*)$/,
            message: '请输入正整数',
            trigger: 'blur',
          },
        ],
        quantity: [
          { required: true, message: '此项为必填项', trigger: 'blur' },
          {
            pattern: /^(0|\+?[1-9][0-9]{0,4})$/,
            message: '请输入不超过五位数的正整数',
            trigger: 'blur',
          },
        ],
      }
    },

Pour cette raison, j'ai imprimé les données d'addition correspondantes et j'ai constaté que l'addition s'est avérée être 0,99999. J'ai soudain réalisé qu'il y avait un problème de perte de précision, pour cette raison, il me suffisait de la modifier.

 

 const sum = (num) => {
          let i = 0,
            result = 0
          while (i < num.length) {
            result += Number(num[i])
            i++
          }
          return Number(result.toFixed(2)) // 将结果四舍五入到2位小数  解决精度丢失问题
}

Vous pouvez enfin résoudre ce petit problème

Je suppose que tu aimes

Origine blog.csdn.net/weixin_42125732/article/details/131452417
conseillé
Classement