Peut opérateurs mathématiques *, /, +, -, ^ être utilisé pour convertir un nombre différent de zéro à 1?
Je travaille avec le logiciel (Oracle Siebel) qui ne prend en charge JavaScript expressions avec les opérateurs multiplier, diviser, soustraire, 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 à 1 si elle est non nulle et le laisser à 0 si elle est déjà à zéro? Le nombre peut être positif, nul 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 de 0. d
doit être à 0 lors de la c
est de 0.
c est une valeur de la monnaie, et il aura un maximum de deux chiffres de fin et les 12 grands chiffres.
Je suis en train d'imiter un if
condition par la conversion d'un nombre en une valeur Booléenne 0 ou 1, et en multipliant ensuite les autres parties de l'expression.
- Les commentaires ne sont pas pour de longues discussions; cette conversation a été déplacé pour chat.
- Bien qu'il existe beaucoup de commentaires, et certains d'entre eux devrait être supprimé (discussion, réponse en commentaire), la plupart d'entre eux sont vraiment en demande d'éclaircissements (par exemple). Commentaires demandant si c'est un XY problème est à la limite.
- Oracle Siebel Opérateurs Numériques, semble être Exposant: docs.oracle.com/cd/E95904_01/books/VBLANG/...
- Il semble qu'il y ait une distinction entre Siebel VB et Siebel eScript. Dans le second, c'est un xor au niveau du bit. Je ne sais pas lequel des deux s'applique ici.
- si l'OP dit JavaScript puis xor il est. Mais alors
^
est un opérateur au niveau du bit afin que les autres opérateurs au niveau du bit devrait être autorisé aussi. - une fois la totalité d'un fil de commentaires devient trop long, nous n'allons pas traiter individuellement les commentaires différemment, comme le mod interface créée par SE administrateurs/développeurs préfère nos actions par défaut soit "move to chat" ou "supprimer tout". Si tout commentaire est utile, elle doit être éditée dans la question elle-même ou posté une réponse. Si tout commentaire est hors-sujet, ils doivent avoir été auto-taillés ou supprimés. Si vous souhaitez discuter de ce mod "fonctionnalité" et/ou "trop de commentaires" auto drapeaux modérateurs obtenir, prière d'apporter à la discussion sur Meta ou Méta.SE. Je vous remercie.
- Vous avez l'option de ne rien faire et laisser les commentaires là, si.
Vous devez vous connecter pour publier un commentaire.
c /(c + 5e-324)
devrait fonctionner. (La constante5e-324
estNombre.MIN_VALUE
, représentable le plus faible nombre positif.) Si x est égal à 0, c'est exactement 0, et si x est différent de zéro (techniquement, si x est au moins 4.45014771701440252 e-308, dont le plus petit nombre différent de zéro admis dans la question, 0.01, est), du JavaScript mathématiques à virgule flottante est trop imprécise pour la réponse sera différente de 1, de sorte qu'il va sortir comme exactement 1.s/JavaScript's floating-point math/IEEE754
other parts of the expression
, etc / (c + 5e-324) * some_expression
ne fonctionne pasNumber(Boolean(n))
, qui n'utilise pas de l'opérateur. Je n'ai pas dit que ce n'est pas ce que la réponse de l'OP cherchais, mais ce n'est pas la réponse à la question de l'OP décrit. Probablement devrait améliorer la question.NaN-NaN
estNaN
, si vous avez réellement besoin de la constante de zéro à faire que de répondre de travail pour toutes les entrées.-5e-324
?Utiliser l'expression
n/n^0
.Si
n
n'est pas nul:Si
n
est égale à zéro:Comme vous pouvez le voir, toutes les valeurs non nulles sont convertis à 1, et 0 reste à 0. Il exploite le fait qu'en JavaScript,
NaN^0
est de 0.Démo:
JS:
Number.NaN ^ n === n
o_O (oùn
est un nombre fini)NaN
est idéalement converti à zéro. Voir: les opérations bit à Bit sur les numéros non~~NaN === 0
semble plus naturel**
), c'est un XOR au niveau du bit. Opérations au niveau du bit ont une très faible priorité dans le javascript de sorte que la division arriver en premier.(n/n) ^ 0
, qui sera1 ^ 0
sauf pour falsy les valeurs qui seront0 ^ 0
.-1**2
est une erreur de syntaxe. :-/^
est xor au niveau du bit opérateur. Je doute si^
dans l'OP est xor au niveau du bit lorsque tous les autres opérateurs sont des opérateurs arithmétiques. C'est probablement l'opérateur exponentiel (**
en JavaScript).^
est l'opérateur XOR.(((c/c)^c) - c) * (((c/c)^c) - c)
retournera toujours 1 pour des négatifs et des positifs et 0 pour 0.Il est certainement plus de confusion que la réponse choisie et plus. Cependant, j'ai l'impression que c'est moins hacky et en ne s'appuyant pas sur des constantes.
EDIT: Comme @JosephSible mentionne, une version plus compacte de la mine et @CRice est la version qui n'utilise pas de constantes est:
c
^
que l'exponentiation, comme l'implique l'OP "multiplier, diviser, soustraire, ajouter, et exposant (*, /, -, +, ^)". Si^
est XOR avec son JavaScript priorité alors je me trompe. J'ai demandé des précisions sur l'OP.Très compliqué de répondre, mais qui ne dépendent pas de la précision limitée: Si vous prenez
x^(2**n)
, ce sera toujours égal àx+2**n
si x est égal à zéro, mais il sera égal àx-2**n
si x a un dans le n-ième place. Ainsi, pour x=0,(x^(2**n)-x+2**n)/(2**(n+1)
sera toujours de 1, mais il va parfois être égal à zéro pour x !=0. Donc, si vous prenez le produit de(x^(2**n)-x+2**n)/(2**(n+1)
sur tous les n, alors XOR qu'avec 1, vous obtenez votre fonction désirée. Vous devez coder manuellement à chaque facteur. Et vous aurez à modifier si vous utilisez floating points.Si vous avez la
==
l'opérateur, puis(x==0)^1
œuvres.**
ni==
est disponible.