#javascript #floating-point #precision #floating-accuracy
#javascript #плавающая точка #точность #плавающая точность
Вопрос:
Привет, ребята, я работаю над javascript
файлом об астрономических расчетах, поэтому мне нужно больше точности. У меня много операций для каждой строки, и я хочу, чтобы результат был более точным (также десять или двадцать десятичных знаков после запятой).
В JavaScript, если я не объявляю десятичное число (например, используя .ToFixed(n)
), сколько позиций после запятой язык учитывает при вычислении?
Например:
var a= 1.123456789*3.5; // result 3.9320987615
var b= a/0.321;
var c= b*a;
// c => 48.16635722800571
Это будет результатом?
Как использование всех десятичных знаков после запятой для каждой переменной javascript делает приближения?
Почему в других вопросах пользователям предлагается использовать decimal.js
те или иные библиотеки?
Извините, если мой вопрос кажется глупым, но для меня это важно. Я надеюсь, вы сможете мне помочь.
Извините за мой английский!
Комментарии:
2. Но я должен использовать этот метод для каждой переменной, для каждого данные, каждой строки? Или только для результата?
Ответ №1:
Javascript использует двойную точность IEEE-754, это означает, что он вычисляет числа только с точностью примерно до 15 десятичных разрядов, все остальное отсекается. Если вам нужна большая точность, вы должны использовать decimal.js
или другую подобную библиотеку. Другие вопросы рекомендуют decimal.js
или другие библиотеки, потому что их легко вставить в вашу программу и они могут обеспечить столько точности, сколько вы хотите.
Причина, по которой это не реализовано в компьютере по умолчанию, заключается в том, что компьютеру требуется намного больше усилий для вычисления 20 цифр вместо 15 цифр, потому что компьютер построен для вычисления только 15 десятичных разрядов. Если вы хотите прочитать больше об этом, я бы рекомендовал прочитать арифметику произвольной точности в Википедии.
Комментарии:
1. Другими словами: тип с ок. точность в 15 цифр является аппаратно поддерживаемым типом. Что-либо большее не может быть сделано с доступной аппаратной поддержкой, поэтому это не только сложнее (должно быть сделано полностью программно), но и намного медленнее.
Ответ №2:
Просто потому, что метод toFixed() преобразует число в строку, сохраняя указанное количество десятичных знаков. Таким образом, возвращаемое значение будет строкой, а не числом.