@Vadim1899

JS округление десятков?

Привет!
Подскажите плиз, как можно лучше реализовать такой функционал (или может есть функция для такого)?

Если значение - угол поворота в градусах. Обычно оно float, например, 90.3222341. Мне нужно детектить такие значения, как 0, 45, 90, 135, 180, 225, 270, 315, 360. То есть xy и диагонали.

Например:
90.3222341 => 90
136.99 => 135
358 => 360
46 => 45

Сделал так:
const angleBase = parseInt(value / 10) * 10; // (90.3222341 => 90, 0.2222 => 0);
if(angleBase % 45 === 0) { ... }


, но 45, 135, 225, 315 первая строка превращает в 40, 130, 220, 310, теряем по 5 градусов.

Пробовал делать просто .toFixed(0), но тогда могут получаться значения 1, 91, 182, а не 0, 90, 180

На ум приходит большая конструкция из if else а-ля if(value > -1 && value < 1) и т.д., что кажется немного костылем.

Может есть какое-нибудь решение попроще?
  • Вопрос задан
  • 93 просмотра
Решения вопроса 3
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
function round45(value) {
  return Math.round(value / 45) * 45;
}
round45(90.3222341); // 90
round45(136.99); // 135
round45(358); // 360
round45(46); // 45
Ответ написан
dyuriev
@dyuriev
A posteriori
Чисто математически и логически получаем вот такую конструкцию
const angleBase = Math.round(value / 5) * 5;

Но я от js далек, так что возможно есть способ элегантнее
Ответ написан
@afanasiyz
Javascript-разработчик
const check = (angle) => {
  if (angle > 360) {
    return;
  }
  const targetAngles = [0, 45, 90, 135, 180, 225, 270, 315, 360];
  let lastResult = Number.MAX_SAFE_INTEGER;
  for (let i = 0; i < targetAngles.length; i++) {
    let diff = Math.abs(angle - targetAngles[i]);
    if (diff < lastResult) {
      lastResult = diff;
    } else {
      return targetAngles[i - 1];
    }
  }
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы