Я работаю с программным обеспечением (Oracle Siebel) , который поддерживает только выражения JavaScript с операторами умножения, деления, вычитания, добавлять и XOR ( *
, /
, -
, +
, ^
). У меня нет других операторов, таких как !
или ? :
.
Можно ли с помощью указанных выше операторов преобразовать число в 1, если оно не равно нулю, и оставить его 0, если оно уже равно нулю? Число может быть положительным, нулевым или отрицательным.
Пример:
var c = 55;
var d; // d needs to set as 1
Я пробовал c / c
, но он оценивает, NaN
когда c
равен 0. Должен d
быть 0, когда c
0.
c - значение валюты, и оно может состоять максимум из двух завершающих цифр и 12 ведущих цифр.
Я пытаюсь имитировать if
условие, преобразовывая число в логическое значение 0 или 1, а затем умножая другие части выражения.
javascript
siebel
Дейв
источник
источник
Ответы:
c / (c + 5e-324)
должно сработать. (Константа5e-324
-Number.MIN_VALUE
это наименьшее представимое положительное число.) Если x равен 0, это точно 0, а если x отличен от нуля (технически, если x не меньше 4,45014771701440252e-308, что является наименьшим ненулевым числом, допустимым в вопрос, 0,01, есть), математика JavaScript с плавающей запятой слишком неточна, чтобы ответ отличался от 1, поэтому он будет точно равен 1.источник
other parts of the expression
иc / (c + 5e-324) * some_expression
не будет работатьNumber(Boolean(n))
, что оператор не использует. Я не сказал, что это не тот ответ, который искал OP, но это не ответ на вопрос, описанный OP. Вероятно, это должно улучшить вопрос.Используйте выражение
n/n^0
.Если
n
не равно нулю:Если
n
равно нулю:Как видите, все ненулевые значения преобразуются в 1, а 0 остается в 0. Это усиливает тот факт, что в JavaScript
NaN^0
это 0.Демо-версия:
источник
Number.NaN ^ n === n
o_O (гдеn
конечное число)NaN
удобно конвертировать в ноль. См .: Побитовые операции с не числами~~NaN === 0
кажется более естественным**
), это побитовое XOR. Побитовые операции имеют очень низкий приоритет в javascript, поэтому деление происходит первым.^
- побитовый оператор xor. Я сомневаюсь, что^
в OP есть побитовый xor, когда все остальные операторы являются арифметическими операторами. Вероятно, это оператор возведения в степень (**
в JavaScript).(((c/c)^c) - c) * (((c/c)^c) - c)
всегда будет возвращать 1 для отрицательных и положительных результатов и 0 для 0.Это определенно запутывает больше, чем выбранный ответ, и дольше. Однако я чувствую, что он менее хакерский и не полагается на константы.
РЕДАКТИРОВАТЬ: Как упоминает @JosephSible, более компактная версия моей и версии @ CRice, которая не использует константы, это:
источник
c/c^(c-c)
простоc
^
как возведение в степень, подразумеваемое OP «умножение, деление, вычитание, добавление и экспонента (*, /, -, +, ^ )». Если^
это XOR с приоритетом JavaScript, тогда я ошибаюсь. Я попросил разъяснений по ОП.Очень сложный ответ, но тот, который не зависит от ограниченной точности: если вы возьмете
x^(2**n)
, он всегда будет равен,x+2**n
если x равен нулю, но он будет равен,x-2**n
если x имеет единицу на n-м месте. Таким образом, для x = 0(x^(2**n)-x+2**n)/(2**(n+1)
всегда будет 1, но иногда он будет равен нулю при x! = 0. Итак, если вы возьмете произведение(x^(2**n)-x+2**n)/(2**(n+1)
на все n, затем выполните XOR с 1, вы получите желаемую функцию. Однако вам придется вручную кодировать каждый фактор. И вам придется изменить это, если вы используете плавающие точки.Если есть
==
оператор, то(x==0)^1
работает.источник
**
ни==
доступно.