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

dav*_*ave 117 javascript siebel

我与软件(Oracle Siebel软件)仅支持与运营商乘,除,减,添加JavaScript表达式的工作,和XOR( ,*,/,-,).+ ^我没有其他运营商,如!? :可用.

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

例:

var c = 55;

var d;  // d needs to set as 1
Run Code Online (Sandbox Code Playgroud)

我试过了c / c,但是NaN当它c为0 时它的计算结果为d0时需要c为0.

c是货币值,最多有两个尾随数字和12个前导数字.

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

CRi*_*ice 215

使用表达式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.
Run Code Online (Sandbox Code Playgroud)

如果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.
Run Code Online (Sandbox Code Playgroud)

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

演示:

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

  • TIL:`Number.NaN ^ n === n`o_O(其中`n`是有限数) (44认同)
  • 似乎当用作按位操作数时,"NaN"被方便地转换为零.请参阅:[非数字的按位运算](/sf/ask/772646801/) (17认同)
  • @EnricoBorba它不是取幂(使用`**`),它是一个按位异或.按位运算在javascript中具有非常低的优先级,因此除法将首先发生. (7认同)
  • @zerkms也许`~~ NaN === 0`似乎更自然 (3认同)
  • `^`是按位xor运算符.当所有其他运算符都是算术运算符时,我怀疑OP中的`^`是否是按位xor.它可能是指数运算符(JavaScript中的"**"). (3认同)

Jos*_*ica 147

c / (c + 5e-324)应该管用.(常数5e-324Number.MIN_VALUE,最小的可表示正数.)如果x为0,则恰好为0,如果x为非零(技术上,如果x至少为4.45014771701440252e-308,则允许的最小非零数字问题,0.01,is),JavaScript的浮点数学太不精确,答案不同于1,因此它将精确地为1.

  • `s/JavaScript的浮点数学/ IEEE754` (66认同)
  • @ zypA13510"不是答案"是一个大胆的主张,考虑到这是**接受的答案,并且提问者可能不会接受不符合他们要求的东西.我对这个问题的解读是"除了这些之外没有运营商",而不是"除了这些运营商之外". (40认同)
  • 拍摄一个错误并将其转换为一个功能 (28认同)
  • @JosephSible我知道,但如果你真的这么认为,最明显的答案应该是“Number(Boolean(n))”,它不使用运算符。我并没有说这不是OP正在寻找的答案,但这不是OP所描述的问题的答案。不过也许应该改进这个问题。 (2认同)

Kyl*_*dle 17

(((c/c)^c) - c) * (((c/c)^c) - c) 对于负数和正数,将始终返回1,对于0,将返回0.

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

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

c/c^c-c
Run Code Online (Sandbox Code Playgroud)

  • 它不使用常量,只使用运算符和给定变量. (2认同)
  • @JosephSible`c/c ^(cc)`只是`c` (2认同)
  • @JosephSible我正在读取^ ^作为指数,如OP"乘法,除法,减法,加法和**指数**(*,/, - ,+,**^**)"所暗示的那样.如果`^`是XOR并且其JavaScript优先级那么我错了.我要求澄清OP. (2认同)
  • @TavianBarnes,这不是OP所写的; 有人编辑了这个问题.我把它恢复到OP实际问的方式. (2认同)