JavaScript: больше или равно положительному нулю?

Простой вопрос: как проверить, является ли значение больше или равно положительному нулю (+0)? Или как проверить, больше ли отрицательного нуля (-0)?

val >= 0 или val >= +0 или val > -0 не помогут.

(Мне это нужно для обработки вывода moments.js diff().)

Благодарю вас!


person koubic    schedule 28.12.2014    source источник
comment
Нет положительного или отрицательного нуля, есть только ноль!   -  person adeneo    schedule 28.12.2014
comment
@аденео: есть. en.wikipedia.org/wiki/Signed_zero   -  person Karoly Horvath    schedule 28.12.2014
comment
в моей консоли -0==+0 регистрирует true, поэтому в javascript то же самое   -  person cirtrus    schedule 28.12.2014
comment
@KarolyHorvath - не в JS, (+0) === (-0) = true   -  person adeneo    schedule 28.12.2014
comment
@adeneo: это не означает, что нет нуля со знаком. есть: -1/Infinity   -  person Karoly Horvath    schedule 28.12.2014
comment
@KarolyHorvath - и как именно это актуально при использовании логических операторов?   -  person adeneo    schedule 28.12.2014
comment
Кстати, я могу сделать проще -1 * 0   -  person adeneo    schedule 28.12.2014
comment
просто комментарий, но см. здесь: stackoverflow.com/questions/11998340/ ; в Javascript есть специальная реализация для -0/+0, заставляющая их считаться равными, я полагаю, что это соответствует IEEE 754 (en.wikipedia.org/wiki/Signed_zero#Comparisons)   -  person Stephen Byrne    schedule 28.12.2014
comment
@adeneo: ты снова и снова задаешь неправильный вопрос. это не относится к логическим операторам. но это был не вопрос. вы сами придумали этот вопрос. проблема в сравнении. Вы даже пытались сделать то, что просил ОП? Со страницы википедии, на которую я дал ссылку: часто обозначается -0 (отрицательный ноль) и +0 (положительный ноль), считается равным операциями числового сравнения, но с возможным различным поведением в определенных операциях   -  person Karoly Horvath    schedule 28.12.2014
comment
Я хочу сказать, что проверка того, больше ли что-то положительного нуля, будет точно таким же, как проверка того, больше ли что-то отрицательного нуля, нет никакой разницы, и moment, безусловно, не различает их.   -  person adeneo    schedule 28.12.2014
comment
@KarolyHorvath, у вас есть пример числового выражения JavaScript, которое по-разному сравнивается с положительными и отрицательными нулевыми значениями?   -  person Pointy    schedule 28.12.2014
comment
@Pointy: MichaelLu уже опубликовал такой пример.   -  person Karoly Horvath    schedule 28.12.2014
comment
Конечно; побитовое представление значений с плавающей запятой в JavaScript включает два значения для нуля, одно с установленным битом знака и одно без него. Однако вопрос заключается в выполнении сравнений в JavaScript.   -  person Pointy    schedule 28.12.2014
comment
Этот раздел из Вы Незнание JavaScript может помочь   -  person TehShrike    schedule 28.12.2014
comment
@KarolyHorvath Я не уверен, что он это сделал; это правда, что 1/-0 отличается от 1/0, но вопрос заключается в сравнении некоторого конкретного числа с одним (или обоими) 0 и -0. Таким образом, 1/-0 также не больше, чем -0, поэтому результат сравнения тот же.   -  person Pointy    schedule 28.12.2014
comment
@Pointy: мы уже знаем, что этот подход не работает, сказал нам ОП. Вы преследуете вопрос, который здесь неуместен.   -  person Karoly Horvath    schedule 28.12.2014
comment
@Pointy Если у вас есть какое-то значение value и вы хотите проверить, больше ли оно или равно +0, value >= +0 не даст правильного результата, когда value равно -0, но 1 / value > 0 будет дать правильный результат.   -  person JLRishe    schedule 28.12.2014
comment
@KarolyHorvath - Ты тот, кто этого не понимает. moment.diff дает вам разницу между двумя датами, отрицательные значения говорят вам, что одна дата предшествует другой и т. д. Когда функция возвращает ноль, между датами нет разницы, не имеет значения, стоит ли знак минус перед это, если что-то не работает в коде OP, это не проблема, и даже если это так, это можно решить, просто выполнив Math.abs( val ), поскольку это не имеет значения   -  person adeneo    schedule 28.12.2014
comment
@adeneo: я только что проверил, что moment.diff (например, с аргументом days) действительно возвращает +0 или -0 в зависимости от того, предшествует ли одна дата другой или после нее.   -  person Michael Liu    schedule 28.12.2014
comment
@adeneo: это было твое первое разумное предложение, хотя, похоже, оно все еще было неправильным. могу я хотя бы предположить, что вы знаете, что есть подписанный ноль?   -  person Karoly Horvath    schedule 28.12.2014
comment
Ого, какое обсуждение. Просто демонстрация того, что moment.diff возвращает +0 и -0: jsfiddle.net/3hb65204/4   -  person koubic    schedule 28.12.2014
comment
@MichaelLiu - это происходит, если параметр diff недостаточно конкретен, чтобы дать разницу, но разница все же есть, но ноль по-прежнему означает, что в сравнении, которое вы делаете с diff, нет разницы. Другими словами, он используется неправильно, и если вам просто нужно проверить, предшествует ли одна дата другой, вы должны сделать moment(a).unix() > moment(b).unix(), а не использовать diff вообще.   -  person adeneo    schedule 28.12.2014
comment
@JLRishe хорошо, я думаю, это зависит от того, что вы подразумеваете под правильным :) Положительный и отрицательный нуль предполагается сравниваться как равные, поэтому -0>=0 должен быть true.   -  person Pointy    schedule 28.12.2014
comment
@koubic - и он делает это, чтобы показать вам, что в днях нет разницы, даже если есть разница в часах и т. Д. Полагаться на ноль, чтобы определить, является ли дата до или после другой даты, является неправильным вариантом использования.   -  person adeneo    schedule 28.12.2014
comment
@KarolyHorvath - и нет, я не согласен с тем, что есть ноль со знаком, может быть разница побитовая, но при логическом использовании есть только один ноль.   -  person adeneo    schedule 28.12.2014
comment
@adeneo: ты псих...   -  person Karoly Horvath    schedule 28.12.2014
comment
@Pointy Ну да, учитывая спецификацию своих операторов сравнения, JavaScript считает их равными, но не считает их одинаковыми (иначе он не делал бы различий между ними). Поэтому, если вы хотите проверить, соответствует ли значение +0 или больше +0, вы можете использовать 1 / value > 0, но не value >= +0. Тем не менее, я согласен с мнением, что это различие не должно иметь значения для сравнения дат. Возможно, ОП мог бы сказать нам, почему это важно здесь? Звучит как проблема XY.   -  person JLRishe    schedule 28.12.2014
comment
@KarolyHorvath - а ты грубый!   -  person adeneo    schedule 28.12.2014
comment
@JLRishe, похоже, это то, что делает Moment, хотя, насколько я могу судить, это не задокументировано. Если у вас есть два неравных объекта Moment и вы сравниваете их на основе степени детализации, при которой они одинаковы, вы получаете поведение +0/-0. Я бы не стал полагаться на это в своем собственном коде.   -  person Pointy    schedule 28.12.2014
comment
@Pointy - правильный ответ на этот вопрос, если OP нужна точность в миллисекундах, будет вместо этого сравнивать временные метки. moment.js, возвращающий -0, — это просто случайность из-за вычислений, выполненных с отметками времени, а затем округленных до заданной точности.   -  person adeneo    schedule 28.12.2014
comment
Считаете ли вы, что +0 и -0 разница в Moment.js является ошибкой и будет удалена в будущем? Мне нужно знать, является ли данная строка (например, 2014-12-28) будущей датой (завтра и т. д.). Я мог бы сделать это, чтобы избежать +/-0: jsfiddle.net/3hb65204/5. Как вы думаете, это лучшее решение? Спасибо.   -  person koubic    schedule 28.12.2014
comment
Ну, я даже могу сделать это еще проще. Не беда, проблема решена, спасибо всем за содержательное обсуждение!   -  person koubic    schedule 29.12.2014


Ответы (1)


Как проверить, больше ли число положительного нуля (+0) или равно ему?

Проверяем, положительна ли его обратная величина:

1 / value > 0

Обратная величина +0 положительна Infinity. Обратное число -0 отрицательное Infinity.

ОБНОВЛЕНИЕ: Тот факт, что diff может возвращать +0 или -0, похоже, не задокументирован, поэтому я бы не стал полагаться на такое поведение. Попробуйте вместо этого использовать isAfter или isBefore:

var d = '2014-12-28';
console.log(moment(d).isAfter(moment()));          // Is the date tomorrow or later?
console.log(!moment(d).isBefore(moment(), 'day')); // Is the date today or later?
person Michael Liu    schedule 28.12.2014