Estoy trabajando con el software (Oracle Siebel) que sólo admite expresiones de JavaScript con los operadores de multiplicar, dividir, restar, sumar y XOR ( *
, /
, -
, +
, ^
). No tengo otros operadores como !
o ? :
disponibles.
Usando los operadores anteriores, ¿es posible convertir un número a 1 si no es cero y dejarlo en 0 si ya es cero? El número puede ser positivo, cero o negativo.
Ejemplo:
var c = 55;
var d; // d needs to set as 1
Lo intenté c / c
, pero se evalúa NaN
cuando c
es 0.Necesita d
ser 0 cuandoc
es 0.
c es un valor de moneda y tendrá un máximo de dos dígitos finales y 12 dígitos iniciales.
Estoy tratando de emular una if
condición convirtiendo un número en un booleano 0 o 1 y luego multiplicando otras partes de la expresión.
javascript
siebel
Dave
fuente
fuente
Respuestas:
c / (c + 5e-324)
Deberia trabajar. (La constante5e-324
esNumber.MIN_VALUE
, el número positivo más pequeño representable.) Si x es 0, eso es exactamente 0, y si x es distinto de cero (técnicamente, si x es al menos 4.45014771701440252e-308, que es el número más pequeño distinto de cero permitido en el pregunta, 0.01, es), la matemática de punto flotante de JavaScript es demasiado imprecisa para que la respuesta sea diferente de 1, por lo que saldrá exactamente como 1.fuente
other parts of the expression
, yc / (c + 5e-324) * some_expression
no funcionaráNumber(Boolean(n))
, que no usa operador. No dije que esta no es la respuesta que estaba buscando el OP, pero esta no es la respuesta a la pregunta que describió el OP. Sin embargo, probablemente debería mejorar la pregunta.Usa la expresión
n/n^0
.Si
n
no es cero:Si
n
es cero:Como puede ver, todos los valores distintos de cero se convierten en 1 y 0 permanece en 0. Esto aprovecha el hecho de que en JavaScript,
NaN^0
es 0.Manifestación:
fuente
Number.NaN ^ n === n
o_O (donden
es un número finito)NaN
se convierte convenientemente a cero. Ver: Operaciones~~NaN === 0
parece más natural**
), es un XOR bit a bit. Las operaciones bit a bit tienen una precedencia muy baja en javascript, por lo que la división ocurrirá primero.^
es el operador xor bit a bit. Dudo que^
en el OP sea xor bit a bit cuando todos los demás operadores son operadores aritméticos. Probablemente sea el operador de exponenciación (**
en JavaScript).(((c/c)^c) - c) * (((c/c)^c) - c)
siempre devolverá 1 para negativos y positivos y 0 para 0.Definitivamente es más confuso que la respuesta elegida y más largo. Sin embargo, siento que es menos hacky y no depende de constantes.
EDITAR: Como menciona @JosephSible, una versión más compacta de la mía y la versión de @ CRice que no usa constantes es:
fuente
c/c^(c-c)
es soloc
^
como exponenciación como lo implica el OP "multiplicar, dividir, restar, sumar y exponente (*, /, -, +, ^ )". Si^
es XOR con su precedencia de JavaScript, entonces estoy equivocado. Pedí una aclaración sobre el PO.Una respuesta muy complicada, pero que no depende de una precisión limitada: si toma
x^(2**n)
, esto siempre será igual ax+2**n
si x es cero, pero será igual ax-2**n
si x tiene un uno en el enésimo lugar. Por lo tanto, para x = 0,(x^(2**n)-x+2**n)/(2**(n+1)
siempre será 1, pero a veces será cero para x! = 0. Entonces, si toma el producto de(x^(2**n)-x+2**n)/(2**(n+1)
todo n, entonces XOR eso con 1, obtendrá la función deseada. Sin embargo, tendrá que codificar manualmente cada factor. Y tendrás que modificar esto si estás usando puntos flotantes.Si tiene el
==
operador, entonces(x==0)^1
funciona.fuente
**
tampoco==
está disponible.