2014-03-03 3 views
3

Во время тестирования я заметил что-то странное с Math.round().Почему округление -0.1 return -0

Когда я округление отрицательных чисел, близкие к 0 (-0.1, -0.01 и т.д.), возвращаемое значение в моей консоли будет -0, а не 0. Даже незнакомец, если бы я должен был установить то же значение в тексте элемента, элемент отобразил бы 0, а не -0.

DEMO: http://jsfiddle.net/dirtyd77/qcug9/

enter image description here

Может кто-нибудь объяснить, почему это происходит? Любая помощь будет принята с благодарностью!

Кроме того, я использую Chrome версии 33.0.1750.117.

+0

'-0 == 0' оценивается в true – 0xcaff

+1

Возникает вопрос:« Что такое -0 и почему оно отличается от 0? » – Gareth

+0

Это причуда Javascript. Прочитайте http://www.2ality.com/2013/04/quirk-undefined.html для получения дополнительной информации. Также выполните поиск: Javascript Quirks для некоторых других развлечений. –

ответ

3

Тип чисел Использование JavaScript (плавающая точка с двойной точностью IEEE-754) имеет концепцию «положительного» и «отрицательного» нуля.

Следующее самое большое целое число до -0.1 - -0. «Высший» в этом случае означает «к положительной бесконечности».

От the specification, §15.8.2.15 "Math.round":

Если x меньше 0, но больше или равно -0.5, результат −0.

-0 и +0 оба оказали как только что 0 при преобразовании в строку. Например:

console.log(-0)   // 0 or -0 depending on what console you use 
console.log(String(-0)) // 0 (always) 
+0

Спасибо за ваш ответ, TJ! Я нашел что-то очень интересное в статье, которую вы предоставили. 'Обратите внимание, что есть как положительный ноль, так и отрицательный ноль. Для краткости эти значения также обозначаются для целей пояснения символами +0 и -0 соответственно. (Обратите внимание, что эти два разных значения нулевого числа создаются программными выражениями +0 (или просто 0) и -0.) ' – Dom

1

JavaScript использует IEEE-754 to represent numbers и спецификации считает 0 и -0 технически отличается. Предположительно, отрицательный ноль является целым числом, ближайшим к этим значениям, как определено Math.round(x).

Обратите внимание на то, что ноль равен нулю и строго равен отрицательному нулю (0==-0 и 0===-0).

Вы можете обходным путем, выполнив Math.abs(Math.round(x)), если вы не хотите видеть -0.

+0

Почему downvote? – maerics

+0

Я не уверен, почему вы были заблокированы, я думал, что ваш ответ информативен! Еще раз спасибо за то, что нашли время ответить! – Dom

1

Формат двойной точности IEEE допускает отрицательный ноль (отличный от положительного 0). Значения считаются почти равными (например, они равны, даже если сравнивать с === и -0 не считаются «менее» 0), но, например, 1/0 - infinity, а 1/-0 - -infinity.

IMO Вам не следует пытаться слишком много читать в этой семантике.

+0

Спасибо, что нашли время ответить! Я также заметил '0 === -0', и я непременно возьму ваш совет за то, что не слишком много читал об этом. :-D – Dom

Смежные вопросы