Je travaille avec le logiciel (Oracle Siebel) qui ne supporte que des expressions JavaScript avec les opérateurs se multiplient, se divisent, soustraient, ajouter et XOR ( *
, /
, -
, +
, ^
). Je n'ai pas d'autres opérateurs tels que !
ou ? :
disponibles.
En utilisant les opérateurs ci-dessus, est-il possible de convertir un nombre en 1 s'il est différent de zéro et de le laisser 0 s'il est déjà nul? Le nombre peut être positif, zéro ou négatif.
Exemple:
var c = 55;
var d; // d needs to set as 1
J'ai essayé c / c
, mais il évalue NaN
quand c
est 0. d
doit être 0 quand c
est 0.
c est une valeur monétaire, et il aura un maximum de deux chiffres de fin et 12 chiffres de tête.
J'essaie d'émuler une if
condition en convertissant un nombre en un booléen 0 ou 1, puis en multipliant d'autres parties de l'expression.
la source
Réponses:
c / (c + 5e-324)
devrait marcher. (La constante5e-324
estNumber.MIN_VALUE
, le plus petit nombre positif représentable.) Si x est 0, c'est exactement 0, et si x est différent de zéro (techniquement, si x est au moins 4,45014771701440252e-308, quel est le plus petit nombre différent de zéro autorisé dans le question, 0.01, est), les calculs en virgule flottante de JavaScript sont trop imprécis pour que la réponse soit différente de 1, donc elle sera exactement 1.la source
other parts of the expression
, etc / (c + 5e-324) * some_expression
ne fonctionnera pasNumber(Boolean(n))
, qui n'utilise aucun opérateur. Je n'ai pas dit que ce n'était pas la réponse que le PO recherchait, mais ce n'est pas la réponse à la question décrite par le PO. Cela devrait probablement améliorer la question.Utilisez l'expression
n/n^0
.Si
n
n'est pas zéro:Si
n
vaut zéro:Comme vous pouvez le voir, toutes les valeurs non nulles sont converties en 1 et 0 reste à 0. Cela tire parti du fait qu'en JavaScript,
NaN^0
est 0.Démo:
la source
Number.NaN ^ n === n
o_O (oùn
est un nombre fini)NaN
est commodément converti en zéro. Voir: Opérations au niveau du bit sur les non-nombres~~NaN === 0
semble plus naturel**
), c'est un XOR au niveau du bit. Les opérations au niveau du bit ont une très faible priorité en javascript, donc la division se produira en premier.^
est l'opérateur xor au niveau du bit. Je doute que^
l'OP soit xor au niveau du bit lorsque tous les autres opérateurs sont des opérateurs arithmétiques. C'est probablement l'opérateur d'exponentiation (**
en JavaScript).(((c/c)^c) - c) * (((c/c)^c) - c)
renverra toujours 1 pour les négatifs et les positifs et 0 pour 0.C'est certainement plus déroutant que la réponse choisie et plus longue. Cependant, j'ai l'impression que c'est moins hacky et ne repose pas sur des constantes.
EDIT: Comme le mentionne @JosephSible, une version plus compacte de la mienne et de la version de @ CRice qui n'utilise pas de constantes est:
la source
c/c^(c-c)
est justec
^
comme exponentiation comme l'implique l'OP "multiplier, diviser, soustraire, additionner et exposer (*, /, -, +, ^ )". Si^
est XOR avec sa priorité JavaScript, je me trompe. J'ai demandé des éclaircissements sur le PO.Une réponse très compliquée, mais qui ne dépend pas d'une précision limitée: si vous prenez
x^(2**n)
, ce sera toujours égal àx+2**n
si x est nul, mais ce sera égal àx-2**n
si x a un un à la nième place. Ainsi, pour x = 0,(x^(2**n)-x+2**n)/(2**(n+1)
sera toujours 1, mais il sera parfois nul pour x! = 0. Donc, si vous prenez le produit de(x^(2**n)-x+2**n)/(2**(n+1)
sur tout n, puis XOR avec 1, vous obtiendrez la fonction souhaitée. Vous devrez cependant coder manuellement chaque facteur. Et vous devrez le modifier si vous utilisez des virgules flottantes.Si vous avez l'
==
opérateur, puis(x==0)^1
fonctionne.la source
**
ni==
disponible.