Как избежать десятичных ошибок в javascript? - PullRequest
1 голос
/ 01 марта 2020

Я делаю форму для добавления продукта с использованием VueJS и платформы Quasar.

У меня проблемы с вычислениями небольшим, но критическим способом. Иногда я получаю, что цена не соответствует цене, например 0,01. Я гуглил свой способ узнать, что есть Нечто с тем, как Javascript вычисляет десятичные значения, очевидно, не проблема с целочисленными значениями.

Я быстро сделал jsfiddle, где вы можете воссоздать мою проблему, добавив 100 в первое поле (цена), а затем изменив выбор НДС на что угодно (у скрипки есть ошибка, и она рассчитывается с ранее выбранным значением, а не с текущим).

Предполагается, что он останется равным 100, но вернет 100.01.

https://jsfiddle.net/5y60s2rk/18/

Вот код реального проекта

   <q-input
    v-model="product.price"
    type="number"
    @input="updatePriceIncVat"
  />

  <q-input
    v-model="product.price_vat"
    type="number"
    @input="updatePriceExclVat"
  />

  <q-select
    v-model="product.vat"
    :options="selectVat"
    emit-value
    map-options
    @input="updatePriceExclVat"
  />

  data () {
    return {
      product: {
        price: '',
        price_vat: '',
        vat: 1.24
      },
      selectVat: [
        {
          label: '0%',
          value: 1
        },
        {
          label: '10%',
          value: 1.10
        },
        {
          label: '14%',
          value: 1.14
        },
        {
          label: '24%',
          value: 1.24
        }
      ]
  }
  methods: {
    updatePriceIncVat () {
      this.product.price_vat = Number((this.product.price / this.product.vat).toFixed(2))
    },
    updatePriceExclVat () {
      this.product.price = Number((this.product.price_vat * this.product.vat).toFixed(2))
    }
  }
}

Я попытался round (), пытаясь избежать десятичных чисел путем умножения на 100, удаления десятичных дробей и повторного деления на правильное число. Но в какой-то момент у меня все равно получается умножение десятичной дроби, и это портит ее.

Спасибо, если вы зашли так далеко, я очень ценю, что вы уделили мне время.

...