Следующее нечетное число в javascript
Чтобы найти следующее нечетное число для ввода, используется следующий код:
a=5.4; // Input
b=Math.ceil(a); // Required to turn input to whole number
b=b+(((b % 2)-1)*-1); // Gives 7
Требуется функция округления округления.
Это безопасно и есть более компактный способ сделать это?
EDIT. Когда вход уже является нечетным целым числом, ничего не происходит. Например, 5.0 вернет 5
Ответы
Ответ 1
При запросе автора вопроса:
Самый компактный способ его достижения -
b = Math.ceil(a) | 1;
Сначала используйте ceil()
, чтобы получить наименьшее целое число, не меньшее a
, затем получим наименьшее нечетное целое число, не меньшее ceil(a)
, выполнив поразрядное или с 1, чтобы гарантировать, что последний бит установлен без изменения чего-либо еще.
Чтобы получить наименьшее нечетное целое, строго большее a
, используйте
b = Math.floor(a+1) | 1;
Предостережение:
Бит-операторы работают с подписанными 32-битными целыми числами в Javascript, поэтому значение a
должно быть меньше или равно 2^31-1
, соответственно. строго меньше для второго. Кроме того, a
должен быть больше -2^31-1
.
Если представление целых чисел со знаком не является двумя дополнениями, а дополнениями или знаками и знаками (я не знаю, допускает ли Javascript это, Java нет, но это возможность в C), значение of a
должно быть больше, чем -1
- результат Math.ceil(a)
соответственно. Math.floor(a+1)
должен быть неотрицательным.
Ответ 2
Как насчет просто
b += b % 2 ^ 1;
Остаток после деления на 2 всегда будет 0 или 1, поэтому оператор ^
(exclusive-OR) переворачивает его на противоположное.
(Кроме того, будет работать и функция (b & 1) ^ 1
. О, я думаю, b = b ^ 1
будет работать для целых положительных чисел, но это будет проблематично для больших целых чисел.)
Ответ 3
Не очень короче, но это более разборчиво:
a=5.4;
b=Math.ceil(a);
b = b % 2 ? b : b + 1;
Ответ 4
Попробуйте следующее:
a = 5.4
b = Math.ceil(a)
b = b%2 == 0 ? b+1 : b
Ответ 5
y = Math.ceil((x - 1)/2)*2 + 1
Выполнить fn на http://www.intmath.com/functions-and-graphs/graphs-using-jsxgraph.php
Ответ 6
Без Math.ceil()
это можно сделать так:
b = a + a % 2 | 0 + 1;
NB. Я рассматриваю следующее нечетное число 5.0
как 7
.