Ich arbeite mit Software (Oracle Siebel) , die nur mehrfach JavaScript Ausdrücke mit Operatoren unterstützt, teilen, subtrahieren, addieren, und XOR ( *
, /
, -
, +
, ^
). Ich habe keine anderen Operatoren wie !
oder ? :
verfügbar.
Ist es mit den obigen Operatoren möglich, eine Zahl in 1 umzuwandeln, wenn sie nicht Null ist, und sie bei 0 zu lassen, wenn sie bereits Null ist? Die Zahl kann positiv, null oder negativ sein.
Beispiel:
var c = 55;
var d; // d needs to set as 1
Ich habe es versucht c / c
, aber es wird ausgewertet, NaN
wann c
0 ist. Muss d
0 sein, wenn c
0 ist.
c ist ein Währungswert und hat maximal zwei nachfolgende und 12 führende Ziffern.
Ich versuche, eine if
Bedingung zu emulieren , indem ich eine Zahl in eine boolesche 0 oder 1 konvertiere und dann andere Teile des Ausdrucks multipliziere.
quelle
Antworten:
c / (c + 5e-324)
sollte arbeiten. (Die Konstante5e-324
istNumber.MIN_VALUE
die kleinste darstellbare positive Zahl.) Wenn x 0 ist, ist das genau 0, und wenn x ungleich Null ist (technisch, wenn x mindestens 4,45014771701440252e-308 ist, wobei die kleinste Zahl ungleich Null in der Frage, 0,01, ist), JavaScript's Gleitkomma-Mathematik ist zu ungenau, als dass die Antwort von 1 abweichen könnte, sodass sie als genau 1 herauskommt.quelle
other parts of the expression
, undc / (c + 5e-324) * some_expression
nicht funktioniertNumber(Boolean(n))
, die keinen Operator verwendet. Ich habe nicht gesagt, dass dies nicht die Antwort ist, nach der das OP gesucht hat, aber dies ist nicht die Antwort auf die Frage, die das OP beschrieben hat. Wahrscheinlich sollte sich die Frage aber verbessern.Verwenden Sie den Ausdruck
n/n^0
.Wenn
n
nicht Null ist:Wenn
n
Null ist:Wie Sie sehen können, werden alle Werte ungleich Null in 1 konvertiert, und 0 bleibt bei 0. Dies nutzt die Tatsache, dass in JavaScript
NaN^0
0 ist.Demo:
quelle
Number.NaN ^ n === n
o_O (won
ist eine endliche Zahl)NaN
bequem in Null konvertiert wird. Siehe: Bitweise Operationen auf Nicht-Zahlen~~NaN === 0
scheint natürlicher**
), es ist ein bitweises XOR. Bitweise Operationen haben in Javascript eine sehr niedrige Priorität, sodass die Teilung zuerst erfolgt.^
ist bitweiser xor-Operator. Ich bezweifle, dass^
im OP bitweise x ist oder wenn alle anderen Operatoren arithmetische Operatoren sind. Es ist wahrscheinlich der Potenzierungsoperator (**
in JavaScript).(((c/c)^c) - c) * (((c/c)^c) - c)
gibt immer 1 für Negative und Positive und 0 für 0 zurück.Es ist definitiv verwirrender als die gewählte Antwort und länger. Ich denke jedoch, dass es weniger hackig ist und sich nicht auf Konstanten verlässt.
BEARBEITEN: Wie @JosephSible erwähnt, ist eine kompaktere Version von mir und der Version von @ CRice, die keine Konstanten verwendet ,:
quelle
c/c^(c-c)
ist nurc
^
als Exponentiation gelesen, wie dies durch das OP "Multiplizieren, Dividieren, Subtrahieren, Addieren und Exponieren (*, /, -, +, ^ )" impliziert wird . Wenn^
XOR mit seiner JavaScript-Priorität ist, dann irre ich mich. Ich bat um Klarstellung zum OP.Eine sehr komplizierte Antwort, die jedoch nicht von begrenzter Genauigkeit abhängt: Wenn Sie nehmen
x^(2**n)
, ist dies immer gleich,x+2**n
wenn x Null ist, aber es ist gleich,x-2**n
wenn x an der n-ten Stelle eine Eins hat. Somit ist für x = 0(x^(2**n)-x+2**n)/(2**(n+1)
immer 1, aber manchmal ist es für x! = 0 Null. Wenn Sie also das Produkt von(x^(2**n)-x+2**n)/(2**(n+1)
über allen n nehmen, dann XOR, dass mit 1, erhalten Sie Ihre gewünschte Funktion. Sie müssen jedoch jeden Faktor manuell codieren. Und Sie müssen dies ändern, wenn Sie Gleitkommazahlen verwenden.Wenn Sie den
==
Operator haben, dann(x==0)^1
funktioniert.quelle
**
noch==
verfügbar.