Разница между числами и числами в Javascript? - PullRequest
14 голосов
/ 03 марта 2011

Я просматриваю код из библиотеки Google Closure и нашел следующую строку:

var isNegative = number < 0.0 || number == 0.0 && 1 / number < 0.0;

Я понял, что причина такой изначально странно выглядящей проверки подписи заключается видентифицируйте -0 как отрицательное, но есть ли причина использовать 0.0 вместо 0?

Ответы [ 2 ]

18 голосов
/ 03 марта 2011

(С 2011 года, когда был опубликован этот ответ, многое изменилось - см. Обновления ниже)

2019-июнь Обновление

BigInt имеетбыл в V8 (Node.js и браузерах на основе Chromium) с мая 2018 года. Он должен появиться в Firefox 68 - см. билет SpiderMonkey .Также реализовано в WebKit .

BigDecimal еще не было реализовано ни одним движком.Посмотрите на альтернативную библиотеку .

2015 Обновление

Прошло более 4 лет с тех пор, как я написал этот ответ, и теперь ситуация намного сложнее.

Теперь у нас есть:

Скоро у нас будет:

Это означает, что число числовых типов, доступных в JavaScript, будет расти только от одного:

, по крайней мере, до следующего в WebAssembly :

  • 8-битное целое число (со знаком и без знака)
  • 16-битное целое число (со знаком и без знака)
  • 32-битное целое число(подписано и не подписано)
  • 64-бит целое число (со знаком и без знака)
  • 32-разрядная с плавающей запятой
  • 64-разрядная с плавающей запятой

(Технически внутренние представления всех целочисленных типов не имеют знака насамый низкий уровень, но различные операторы могут рассматривать их как подписанные или неподписанные, например, int32.sdiv против int32.udiv и т. д.)

Они доступны в типизированных массивах :

  • 8-битное целое число без знака со знаком 8
  • 8-битное целое число без знака
  • 8-битное целое число без знака (с ограничением)
  • 16-битное целое число без знака с дополнением
  • 16-разрядное целое число без знака
  • 32-разрядное целое число с двойным дополнением до числа со знаком
  • 32-разрядное целое число без знака
  • 32-разрядное число с плавающей запятой IEEE
  • 64-битное число с плавающей точкой IEEE

asm.js определяет следующие числовые типы:

  • int
  • подписано
  • без знака
  • intish
  • fixnum
  • double
  • double?
  • float
  • float?
  • floatish

Оригинальный ответ 2011

В JavaScript есть только один тип чисел - двойной * IEEE 754прецизионное число с плавающей точкой .

См. эти вопросы, чтобы узнать некоторые последствия этого факта:

2 голосов
/ 10 апреля 2015

Хотя в Javascript есть только один тип чисел, многим программистам нравится показывать, что их код работает как с числами с плавающей запятой, так и с целыми числами. Причиной показа десятичной точки является документация .

var isNegative = number < 0 || number == 0 && 1 / number < 0;

Это работает точно так же, как в библиотеке закрытия. Но некоторые программисты, читающие код, думают, что он работает только с целыми числами.

Приложение: - Недавно я натолкнулся на статью Д. Барановского, который много критикует библиотеку Google Closure и отмечает, что «Это библиотека JavaScript, написанная разработчиками Java, которые явно не получают JavaScript». Он указывает на другие примеры этого введите путаницу, в color.js https://github.com/google/closure-library/blob/master/closure/goog/color/color.js

https://www.sitepoint.com/google-closure-how-not-to-write-javascript/

...