数学运算符 * ,/,+ ,-,^ 可以用来将非零数转换为1吗?

我使用的软件(Oracle Siebel)只支持 JavaScript 表达式的运算符乘、除、减、加和 XOR (*/-+^)。我没有其他运营商,如 !? :可用。

使用上面的运算符,是否可以将一个非零的数字转换为1,如果已经为零则保持为0?数字可以是正数、零或负数。

例如:

var c = 55;


var d;  // d needs to set as 1

I tried c / c , but it evaluates to NaN when c is 0. d needs to be 0 when c is 0.

C 是一个货币值,它最多有两个尾数和12个前导数。

我试图通过将一个数字转换为布尔0或1,然后乘以表达式的其他部分来模拟 if条件。

15496 次浏览

c / (c + 5e-324)应该能用。(常数 5e-324Number.MIN_VALUE,是可表示的最小正数。)如果 x 是0,那就是0,如果 x 是非零的(技术上来说,如果 x 至少是4.45014771701440252e-308,这是问题中允许的最小非零数,0.01,是) ,JavaScript 的浮点数学太不精确了,所以答案不可能与1不同,所以它得出的结果正好是1。

使用表达式 n/n^0

如果 n不是零:

 Step    Explanation
------- -------------------------------------------------------------------------------
n/n^0   Original expression.
1^0     Any number divided by itself equals 1. Therefore n/n becomes 1.
1       1 xor 0 equals 1.

如果 n为零:

 Step    Explanation
------- -------------------------------------------------------------------------------
n/n^0   Original expression.
0/0^0   Since n is 0, n/n is 0/0.
NaN^0   Zero divided by zero is mathematically undefined. Therefore 0/0 becomes NaN.
0^0     In JavaScript, before any bitwise operation occurs, both operands are normalized.
This means NaN becomes 0.
0       0 xor 0 equals 0.

如您所见,所有非零值都转换为1,0保持为0。这利用了 JavaScript 中 NaN^0为0的事实。

演示:

[0, 1, 19575, -1].forEach(n => console.log(`${n} becomes ${n/n^0}.`))

这是一个非常复杂的答案,但并不依赖于有限的精度: 如果你取 x^(2**n),如果 x 为0,它总是等于 x+2**n,但是如果 x 的第 n 个位置有一个1,它就等于 x-2**n。因此,对于 x = 0,(x^(2**n)-x+2**n)/(2**(n+1)总是为1,但是对于 x,它有时会为0!= 0.所以如果你把 (x^(2**n)-x+2**n)/(2**(n+1)的乘积取整个 n,然后用 XOR 把它取1,你就得到了你想要的函数。但是,您必须手动编写每个因素的代码。如果你使用浮点数,你必须修改它。

如果您有 ==操作符,那么 (x==0)^1可以工作。

(((c/c)^c) - c) * (((c/c)^c) - c)对于正面和负面总是返回1,对于0总是返回0。

它肯定比选择的答案更令人困惑,而且更长。但是,我觉得它不那么粗糙,不依赖于常量。

编辑: 正如@JosephSible 提到的,我和@CRice 的版本的一个更紧凑的版本,它不使用常量:

c/c^c-c