JS - Математика не выходит правильно

Я создаю приложение, которое отображает погоду и преобразует текущую температуру из градусов по Фаренгейту в градусы Цельсия. По какой-то причине, когда происходит преобразование, математика выходит неправильной. Как ни странно, после нажатия кнопки 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


person Aaron Benjamin    schedule 15.05.2018    source источник
comment
Кажется, все в порядке, если не считать того, что Сиэтл горит.   -  person epascarello    schedule 15.05.2018
comment
Кодовое перо правильно конвертирует для меня.   -  person Clint    schedule 15.05.2018
comment
@Clint - Даже после загрузки данных?   -  person Aaron Benjamin    schedule 15.05.2018
comment
Теперь он не горит, и я предполагаю, что вам нужно узнать о stackoverflow.com/questions/588004/   -  person epascarello    schedule 15.05.2018
comment
@AaronBenjamin А, нет. Я инстинктивно нажимаю «Блокировать» в этих уведомлениях.   -  person Clint    schedule 15.05.2018


Ответы (1)


Полезно масштабировать ваши десятичные значения с помощью постоянного множителя и представлять все числа как целые числа. Например, используйте 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 для решения этой проблемы, потому что он будет округлять десятичные значения, и вы потеряете точность.

person Elliot B.    schedule 15.05.2018