Eu estou trabalhando com software (Oracle Siebel), que suporta apenas expressões JavaScript com operadores multiplicar, dividir, subtrair, adicionar e XOR ( *
, /
, -
, +
, ^
). Não tenho outras operadoras como as !
ou ? :
disponíveis.
Usando os operadores acima, é possível converter um número para 1 se for diferente de zero e deixá-lo 0 se já for zero? O número pode ser positivo, zero ou negativo.
Exemplo:
var c = 55;
var d; // d needs to set as 1
Eu tentei c / c
, mas avalia NaN
quando c
é 0. d
precisa ser 0 quando c
é 0.
c é um valor monetário e terá no máximo dois dígitos finais e 12 dígitos iniciais.
Estou tentando emular uma if
condição convertendo um número em um booleano 0 ou 1 e, em seguida, multiplicando outras partes da expressão.
javascript
siebel
Dave
fonte
fonte
Respostas:
c / (c + 5e-324)
Deveria trabalhar. (A constante5e-324
éNumber.MIN_VALUE
, o menor número positivo representável.) Se x for 0, isso é exatamente 0, e se x for diferente de zero (tecnicamente, se x for pelo menos 4,45014771701440252e-308, que é o menor número diferente de zero permitido no questão, 0,01, é), a matemática de ponto flutuante do JavaScript é muito imprecisa para que a resposta seja diferente de 1, portanto, será exatamente 1.fonte
other parts of the expression
, ec / (c + 5e-324) * some_expression
não funcionaráNumber(Boolean(n))
, que não usa operadora. Eu não disse que não era essa a resposta que o OP estava procurando, mas essa não é a resposta à pergunta que o OP descreveu. Provavelmente deve melhorar a questão.Use a expressão
n/n^0
.Se
n
não for zero:Se
n
for zero:Como você pode ver, todos os valores diferentes de zero são convertidos em 1 e 0 permanece em 0. Isso aproveita o fato de que, em JavaScript,
NaN^0
é 0.Demo:
fonte
Number.NaN ^ n === n
o_O (onden
é um número finito)NaN
é convenientemente convertido para zero. Veja: Operações bit a bit em não números~~NaN === 0
pareça mais natural**
), é um XOR bit a bit. Operações bit a bit têm uma precedência muito baixa em javascript, então a divisão acontecerá primeiro.^
é o operador xor bit a bit. Duvido que^
no OP seja xor bit a bit quando todos os outros operadores são operadores aritméticos. Provavelmente é o operador de exponenciação (**
em JavaScript).(((c/c)^c) - c) * (((c/c)^c) - c)
sempre retornará 1 para negativos e positivos e 0 para 0.É definitivamente mais confuso do que a resposta escolhida e mais longo. No entanto, eu sinto que é menos hacky e não depende de constantes.
EDITAR: Como @JosephSible menciona, uma versão mais compacta da minha e a versão do @CRice que não usa constantes é:
fonte
c/c^(c-c)
é apenasc
^
como exponenciação implícita no OP "multiplique, divida, subtraia, adicione e exponente (*, /, -, +, ^ )". Se^
for XOR com sua precedência de JavaScript, estou errado. Pedi esclarecimentos sobre o OP.Uma resposta muito complicada, mas que não depende de precisão limitada: se você pegar
x^(2**n)
, isso sempre será igual ax+2**n
se x for zero, mas será igual ax-2**n
se x tiver um na enésima casa. Assim, para x = 0,(x^(2**n)-x+2**n)/(2**(n+1)
sempre será 1, mas às vezes será zero para x! = 0. Portanto, se você pegar o produto de(x^(2**n)-x+2**n)/(2**(n+1)
todo n, então XOR isso com 1, você obterá a função desejada. Você terá que codificar manualmente cada fator, no entanto. E você terá que modificar isso se estiver usando pontos flutuantes.Se você tiver a
==
operadora, então(x==0)^1
funciona.fonte
**
nem==
está disponível.