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

Кажется, все в порядке, но Сиэтл горит.

epascarello 15.05.2018 18:08

Кодовое перо у меня правильно конвертирует.

Clint 15.05.2018 18:10

@Clint - Даже после загрузки данных?

Aaron Benjamin 15.05.2018 18:14

Теперь он не горит, и я думаю, вам нужно узнать о stackoverflow.com/questions/588004/…

epascarello 15.05.2018 18:18

ObLink: docs.sun.com/source/806-3568/ncg_goldberg.html

Dave Newton 15.05.2018 18:22

@AaronBenjamin А, нет. Я инстинктивно нажимаю «Заблокировать» в этих уведомлениях.

Clint 15.05.2018 18:23
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
3
6
90
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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

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

Исправлено:

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

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

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

Другие вопросы по теме