значение 1.3 становится 1.40000001 в parsefloat

#angular #typescript #numbers #parsefloat

#angular #typescript #числа #parsefloat

Вопрос:

Я считываю некоторые значения из mongodb, а затем у меня есть несколько вариантов, которые увеличивают цену. существует 2 типа опций, одиночных и множественных. если один, все операции выполняются гладко. если несколько, когда я считываю значение (например, «1.3»), синтаксический анализ с плавающей точкой возвращает 1.4000001, код, который это делает, выглядит следующим образом :

  this.item.productPrice = parseFloat(this.item.productPrice) - 
   parseFloat(a.price);
 

и

           this.item.productPrice = parseFloat(this.item.productPrice)   parseFloat(a.price);

 

при использовании debugger в начале строки item.ProductPrice равно 1.3, но после синтаксического анализа оно становится 1.4000001 и добавляет a.price

полный кодовый блок

 //this one takes the selection and adds it to selectedparams array
  selected(ev: any) {
    debugger;
    const a = JSON.parse(ev);
    if (a.multiple) {
      if (Array.isArray(this.selectedparams[a.paramName])) {
        const va = !a.value;
        const index = this.objectinArray(this.selectedparams[a.paramName], {
          option: a.option,
          price: a.price,
          value: va
        });
        if (index !== -1) {
          this.item.productPrice = parseFloat(this.item.productPrice) - parseFloat(a.price);
          this.selectedparams[a.paramName].splice(index, 1);
          this.zone.run(() => {});
        } else {
          this.selectedparams[a.paramName].push({ option: a.option, price: a.price, value: a.value });
          this.item.productPrice = parseFloat(this.item.productPrice)   parseFloat(a.price);
          this.zone.run(() => {});
        }
      } else {
        this.selectedparams[a.paramName] = [];
        this.selectedparams[a.paramName].push({ option: a.option, price: a.price, value: a.value });
        this.item.productPrice = this.item.productPrice   parseFloat(a.price);
        console.log('hereeeeeeeeeeeeeeeee', this.item.productPrice);
        this.zone.run(() => {});
      }

    } else {
      this.selectedparams[a.paramName] = { selected: a.selected, price: a.price };
    }
    this.calcPrice();
  }

//this one dows the calculation after adding
  calcPrice() {
    const keys = Object.keys(this.selectedparams);
    console.log(this.item);
    let newprice = this.item.productPrice;
    keys.forEach(el => {
      if (Array.isArray(this.selectedparams[el])) {
        this.selectedparams[el].forEach((i: any) => {
          newprice = newprice   parseFloat(i.price);
        });
      } else {
        newprice = newprice   parseFloat(this.selectedparams[el].price);
      }
    });
    this.showPrice = newprice;
  }
 

Комментарии:

1. Какое значение this.item.productPrice перед добавлением parseFloat(a.price) к нему?

2. @gari this.item.ProductPrice не совпадает с .price. this.item.ProductPrice = 1.3 a.цена = 0.10 итого дополнительно становится = 1.5, а если я удалю его 1.2

Ответ №1:

TLDR (математика позади) — вы могли бы использовать функцию .toFixed():

 var result = parseFloat('0.1')   parseFloat('1.3');
console.log(result.toFixed(1));​ // 1.4

var result = parseFloat('0.1')   parseFloat('1.3');
console.log(result);​ // 1.400000001