Дифференцируя +0 и -0 - PullRequest
       13

Дифференцируя +0 и -0

33 голосов
/ 29 августа 2011

Оказывается, +0 === -0 оценивается как true, несмотря на то, что +0 и -0 являются различными сущностями.Итак, как вы отличаете +0 от -0?

Есть взлом:

if (1 / myZero > 0) {
   // myZero is +0
} else {
   // myZero is -0
}

Могу ли я сделать лучше?

Ответы [ 8 ]

20 голосов
/ 24 ноября 2012

В ECMAScript 6 Object.is ведет себя как ===, за исключением того, что различает положительные и отрицательные нули, а Object.is(NaN, NaN) оценивается как true. (См. здесь для рецензии.)

Chrome 24 поддерживает Object.is.

14 голосов
/ 29 августа 2011

Это все еще какой-то взлом, но взгляд на спецификации показывает это:

9 голосов
/ 11 июля 2012

Согласно книге Дэвида Фланагана, с.34 , деление 1 на ноль приведет к соответствующей бесконечности, которую затем можно использовать при проверке равенства:

1 / 0
> Infinity
1 / -0
> -Infinity

А вот поведение сравнений равенств бесконечностей:

Infinity === -Infinity
> false
Infinity === Infinity
> true
-Infinity === Infinity
> false
-Infinity === -Infinity
> true
4 голосов
/ 29 августа 2011

Возвращает +0:

-0 + 0

Это не помогает дифференцировать -0 и +0, но помогает гарантировать, что некоторое значение не равно -0.

1 / -0       => -Infinity  
1 / (-0 + 0) => Infinity
3 голосов
/ 25 декабря 2015

Чтобы проверить отрицательный ноль, вот одно простое решение.

function isNegativeZero(n) {
    n = Number( n );
    return (n === 0) && (1 / n === -Infinity);
}
2 голосов
/ 16 января 2015

Поскольку люди кажутся в тупике относительно практической необходимости, вот мой пример использования ...

Мне нужно решение для сортировки столбцов таблицы по их индексу. Нажмите <th> и вызовите сортировщик с помощью [порядкового] ​​для возрастания и - [порядкового] ​​для убывания. В первом столбце будет указано -0 по убыванию или 0 по возрастанию.

Так что мне нужно провести различие между +0 и -0 и все закончилось здесь. Решение, которое сработало для меня, содержится в комментарии @ Šime Vidas, но несколько скрыто.

// This comparison works for all negatives including -0
if ( 1 / x > 0 ) { }

1 / -0 > 0  // false
1 / 0 > 0  // true
1 / -99 > 0 // false
1 / 99 > 0 // true

// WRONG: this naive comparison might give unexpected results
if ( x > 0 ) { }

-0 > 0 // true
// Gotcha
1 голос
/ 02 августа 2015

Одна прямая опция в Node.js должна использовать Буфер .

var negZero = Buffer('8000000000000000', 'hex')

var buf = Buffer(8);
buf.writeDoubleBE(myZero);

if (buf.equals(negZero)) {
    // myZero is -0
} else {
    // myZero is +0
}

Кроме того, вы можете легко просматривать их с помощью буферного модуля .

0 голосов
/ 05 июля 2016

Как подсказал Мэтт Фенвик, вы могли бы просто сделать (используя var zero):

if(1/zero===Infinity) {
  // zero is +0
} else {
  // zero is -0
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...