JavaScript 64-битная числовая точность - PullRequest
7 голосов
/ 03 февраля 2009

Есть ли способ представить число с точностью выше 53 бит в JavaScript? Другими словами, есть ли способ представить число с 64-битной точностью?

Я пытаюсь реализовать некоторую логику, в которой каждый бит 64-битного числа представляет что-то. Я теряю младшие значащие биты, когда пытаюсь установить биты выше, чем 2 ^ 53.

Math.pow(2,53) + Math.pow(2,0) == Math.pow(2,53)

Есть ли способ реализовать пользовательскую библиотеку или что-то для этого?

Ответы [ 7 ]

1 голос
/ 15 марта 2013

В библиотеке Google Closure для этого есть goog.math.Long .

0 голосов
/ 25 января 2013

Да, 11 бит зарезервированы для показателя степени, только 52 бита содержат значение, также называемое дробью. Javascript разрешает побитовые операции над числами, но в этих операциях используются только первые 32 бита в соответствии со стандартной спецификацией Javascript.

Я не понимаю вводящих в заблуждение GWT / Java / длинные ответы в Javascript / двойной вопрос, хотя? Javascript это не Java.

0 голосов
/ 06 сентября 2011

Следующий код может работать для вас; Я еще не проверял это однако: BigDecimal для JavaScript

0 голосов
/ 05 февраля 2009

Зачем кому-то нужна 64-битная точность в javascript?

Лонги иногда содержат ID вещи в БД, поэтому важно не потерять некоторые младшие биты ... но числа с плавающей запятой большую часть времени используются для вычислений. Использовать числа с плавающей запятой для хранения денежных или подобных взыскательных значений просто неправильно. Если вам действительно нужна 64-битная точность, выполняйте вычисления на сервере, где он быстрее, и т. Д.

0 голосов
/ 05 февраля 2009

Возможно, мне следовало добавить некоторые технические детали. По сути, в длинной эмуляции GWT используется кортеж из двух чисел, первый из которых содержит старшие 32 бита, а второй - младшие 32 бита длиной 64 бита.

Библиотека, конечно, содержит методы для добавления таких вещей, как добавление двух "длинных" и получение "длинных" результатов. В вашем коде GWT Java это просто выглядит как два обычных long - один не нужно возиться или знать о кортеже. Используя этот подход, GWT позволяет избежать проблемы, на которую вы, вероятно, намекаете, а именно «длинных», отбрасывающих младшие биты точности, что во многих случаях неприемлемо.

Хотя числа с плавающей точкой по определению являются неточными / приближенными к значению, целое число, например long, не является. GWT всегда содержит 64-битную длину - математика, использующая такую ​​длину, никогда не использует точность. Исключением является переполнение, но оно точно соответствует тому, что происходит в Java и т. Д., Когда вы добавляете два очень больших длинных значения, для которых требуется более 64 бит - например, 2 ^ 32-1 + 2 ^ 32-1.

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

0 голосов
/ 03 февраля 2009

Я бы просто использовал либо массив целых чисел, либо строку.

Числа в javascript двойные, я думаю, что в вашем уравнении есть ошибка округления.

0 голосов
/ 03 февраля 2009

Команда GWT добавила поддержку длинной эмуляции, так что длинные Java-файлы действительно содержат 64 бита. Вы хотите 64-битные числа с плавающей запятой или целые числа?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...