JS - Математика не выходит правильно - PullRequest
0 голосов
/ 15 мая 2018

Я создаю приложение, которое отображает погоду и преобразует текущую температуру из Фаренгейта в Цельсий. По какой-то причине, когда происходит преобразование, математика не подходит. Как ни странно, после нажатия кнопки 5 - 6 раз она начинает работать правильно.

Мое лучшее предположение, что я что-то не так делаю с parseInt() или, возможно, переменная не обновляется.

Мысли?

function toggleUnits(){
  if(wUnit.innerHTML == "C"){
    var oldTemp = parseInt(wTemp.innerHTML, 10),
        newTemp = oldTemp * 9 / 5 + 32;
    wTemp.innerHTML= newTemp;
    wUnit.innerHTML = "F";
    unitToggle.innerHTML ="Switch to Celsius";
  }else{
    var oldTemp = parseInt(wTemp.innerHTML, 10),
        newTemp = (oldTemp-32) * 5 / 9;
    wTemp.innerHTML= newTemp;
    wUnit.innerHTML = "C";
    unitToggle.innerHTML ="Switch to Fahrenheit";
  }
}

CodePen: https://codepen.io/abenjamin/pen/ZojJLq

1 Ответ

0 голосов
/ 15 мая 2018

Полезно увеличить ваши десятичные значения последовательным множителем и представить все числа в виде целых чисел.Например, используйте 806 градус вместо 80.6 градус (умножьте на 10) для расчета температуры.Это нужно для того, чтобы избежать нюансов с математикой с плавающей точкой.В JavaScript у нас есть только тип данных с плавающей точкой для числовых значений, но, к счастью, целочисленная математика для типа данных с плавающей точкой является точной .Поэтому увеличение десятичных значений до целых чисел (например, 2550 градусов вместо 25.50 градусов) решает проблему.

Например (преобразование в градусы Фаренгейта в Цельсий):

console.log((80.6-32) * 5 / 9); // outputs 26.999999999999996

Исправлено с помощью:

console.log((806-320) * 5 / 9 / 10 ); // outputs 27

Причина, по которой ваш калькулятор иногда работает правильно, но не в других случаях, заключается в том, что API температуры иногда возвращает целые числа, а в других случаях возвращает десятичные значения.

Я бы не рекомендовалиспользуйте parseInt для решения этой проблемы, потому что он округлит десятичные значения, и вы потеряете точность.

...