Answers:
var x = -100; ~x+1 === 100
但是var x = 100; ~x+1 === -100
。Math.abs
总是使它成为一个积极的事物,而采用那些补语只会使符号反转。
那x *= -1
呢 我喜欢它的简单性。
x
将会翻转的任何数字。如果将x = 23
和推入该等式,x
则将等于-23
。用埃斯卡兰特先生的话说:“正数乘以负数等于负数。负数乘以负数等于正数。” ...“我如何达到这些目标?!”
x=23
,则它将变为-23。问题是,“在JS中将负数转换为正数”,但是以上内容将翻转任何数字,无论是正数还是负数。
x
总是保持积极态度的情况下进行的。我很抱歉@myusuf。
我知道这有点晚了,但是对于那些为此感到挣扎的人,可以使用以下功能:
将任何数字转为正
let x = 54;
let y = -54;
let resultx = Math.abs(x); // 54
let resulty = Math.abs(y); // 54
将任何数字变为负数
let x = 54;
let y = -54;
let resultx = -Math.abs(x); // -54
let resulty = -Math.abs(y); // -54
倒数
let x = 54;
let y = -54;
let resultx = -(x); // -54
let resulty = -(y); // 54
乘以(-1)是将负数转换为正数的最快方法。但是您必须小心,不要将我的错误从正数转换为负数!因此需要额外的检查...
然后Math.abs,Math.floor和parseInt是最慢的。
https://jsperf.com/test-parseint-and-math-floor-and-mathabs/1
我自己做了类似的事情。
num<0?num*=-1:'';
它检查数字是否为负,如果为负,则乘以-1。这确实会返回一个值,如果您捕获它,则由您决定。如果您想将其分配给某些内容,则可能应该执行以下操作:
var out = num<0?num*=-1:num; //I think someone already mentioned this variant.
但这实际上取决于您的目标是什么。对我而言,这很简单,如果否定则为正,否则不做任何事。因此,代码中的“”。在这种情况下,我使用了三级运算符,因为我很想这样做:
if(num<0)num*=-1;
我在这里看到了按位解决方案,也想对此发表评论。
~--num; //Drawback for this is that num original value will be reduced by 1
在我看来,这是非常不错的选择,我们可以这样重写它:
~(num = num-1);
简单来说,我们取负数,取负数,然后按位求反。如果我们对它进行按位反转,通常我们将得到的值1太小。您也可以这样做:
~num+1; //Wont change the actual num value, merely returns the new value
这将执行相同的操作,但先将其取反,然后再将1加到正数上。尽管您不能这样做:
~num++; //Wont display the right value.
这将不会导致优先级的原因,后缀运算符(如num++
〜之前被评估,以及原因前缀)++num
,即使它是在相同的优先级按位难道不工作NOT(〜),是因为它是从右向左计算。我确实尝试过交换它们,但与按位NOT相比,前缀似乎有点挑剔。+1之所以有效,是因为“ +”具有更高的优先级,并将在以后进行评估。
我发现该解决方案非常有趣,因此决定对其进行扩展,因为它刚刚被扔到了那里,而看到它的人可能会忽略它。虽然可以,但无法与浮点数一起使用。
我希望这篇文章并没有脱离最初的问题。:/
我知道另一种方法。此技术对正面和负面都具有负面影响
var x = -24;
var result = x * -1;
反之亦然:
var x = 58;
var result = x * -1;
实时代码:
// NEGATIVE TO POSITIVE: ******************************************
var x = -24;
var result = x * -1;
console.log(result);
// VICE VERSA: ****************************************************
var x = 58;
var result = x * -1;
console.log(result);
// FLOATING POINTS: ***********************************************
var x = 42.8;
var result = x * -1;
console.log(result);
// FLOATING POINTS VICE VERSA: ************************************
var x = -76.8;
var result = x * -1;
console.log(result);
对于函数式编程,Ramda为此提供了一种不错的方法。从正到负,反之亦然。
如果您希望数字始终为正,那么无论如何都可以执行此操作。
function toPositive(n){
if(n < 0){
n = n * -1;
}
return n;
}
var a = toPositive(2); // 2
var b = toPositive(-2); // 2
您也可以尝试此方法,但我不建议这样做:
function makePositive(n){
return Number((n*-n).toString().replace('-',''));
}
var a = makePositive(2); // 2
var b = makePositive(-2); // 2
问题是您可以将数字更改为负数,然后转换为字符串并删除-,然后转换回int。我想这将比使用其他功能需要更多的处理。
我已经在php中进行了测试,第一个功能更快,但是有时JS会做一些疯狂的事情,所以我不能肯定地说。
n*-n
应该是n*-1
。但是,由于与第一个示例的简单性相比,类型转换和方法调用的效率非常低,因此我将完全删除该示例。甚至JS的古怪之处也无济于事