每日一题(五五)实现一个 isNegtiveZero 函数,只检查 +0 和 -0,-0 返回 true ,+0 返回 false

实现一个 isNegtiveZero 函数,只检查 +0 和 -0,-0 返回 true ,+0 返回 false

扫描二维码关注公众号,回复: 11620320 查看本文章

解析:

在 JavaScript 中,Number 是一种定义为 64 位双精度浮点型的数字类型,首先是符号位,然后是 52 的整数位和 11 位 的小数位。如果符号位为 1,其它各位均为 0,那么这个数值会被表示为 “-0”。

所以 JavaScript 的 "0" 值有两个 +0 和 -0。

解题思路:

1、看到 +0 和 -0 ,大概想尝试把该数字通过 toString() 方法转换成字符串,再使用 indexOf('-') 判断是否等于 0 ,或者 charAr(0) 判断是否等于 "-"。很不幸,数值在调用 toString() 方法时就自动将 -0 转换成  0 了。所以此方法行不通。

2、可以尝试另一个思路,计算机在进行四则及与或模等数值运算时,符号本身也参与运算,JavaScript 也是如此,而使用 0 对一数做加减操作对本身是无影响的,乘法虽然得到 +- 0 的结果,但是又回到了问题本身 +- 0 的判断了,因此我们可以考虑除法,加上数值本身有 Infinity 和 -Infinity 的区分,分别表示正无穷和负无穷,我们很容易想到可以使用一个数值来除以 +-0 得到 +-Infinity。我们使用 -1/0 或 1/-0 得到 -Infinity 的结果。

3、同样的,JavaScript 提供了很多函数供你使用,但结果不外乎借助一个数值进行判断。如:

Math.pow(-0,-1) === -Infinity,

Math.atan2(-0,-1) === -Math.PI

答案:

1、利用 +-Infinity

function isNegtiveZero(num){
    if(num !== 0){
        throw RangeError("the arguments must be  +0 or -0");
    }
    return 1/num === -Infinity;
}

2、ECMAScript2015 添加了一个方法 Object.is 用于对数值进行比较,可以用于比较 +-0

Object.is(+0,0); //true

Obect.is(-0,0); //false

function isNegtiveZero(num){
    if(num !== 0){
        throw RangeError("the arguments must be  +0 or -0");
    }
    return !Object.is(num,0);
}

猜你喜欢

转载自blog.csdn.net/MFWSCQ/article/details/106468689