JavaScript десятичная математика - PullRequest
1 голос
/ 19 апреля 2020

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

0.1 + 0.2

Как большинство из нас знает, это не просто возвращает 0.3, а возвращает

0.30000000000000004

Однако в моем приложении я требую, чтобы результаты этих уравнений были очень точными, то есть мне нужно 0,3 в качестве результата. Распространенный способ исправить это - использовать функцию toFixed:

(0.1 + 0.2).toFixed(2) = 0.30

Однако это не решит мою проблему. Допустим, мне нужно разделить 1 на 11, но в этом случае мне действительно нужны все десятичные значения:

1/11 = 0.09090909090909091

, тогда как toFixed(2) на самом деле вернет только 0.09, но для Для моего приложения мне нужна более высокая точность, т.е. приведенный выше результат.

Есть ли способ выполнить эти простые уравнения, в то же время получая точные результаты? т.е. 0.1 + 0.2 = 0.3 и 1/11 = 0.09090909090909091.

РЕДАКТИРОВАТЬ

Вот еще один пример:

15.7 + 17.4 + 17.39 = 50.48999999999999

, тогда как ответ должен быть 50.49

Ответы [ 2 ]

0 голосов
/ 19 апреля 2020

Вы можете использовать метод toPrecision(), который возвращает строку, представляющую ваше число, передавая параметр, указывающий количество значащих цифр (16, если вы хотите обрезать результат), а затем анализировать его в Number.

Для ваших примеров:

Number(parseFloat(0.1 + 0.2).toPrecision(16)) = 0.3

Number(parseFloat(1/11).toPrecision(16)) = 0.09090909090909091
0 голосов
/ 19 апреля 2020

Если вы делаете сложение, вы можете попробовать умножить все на кратное 10 и поделить на него. Например, вместо 0.1 + 0.2, сделайте (0.1 * 100 + 0.2 * 100) / 100. Это составляет 30, что вы можете затем разделить на 100.
Для деления вы можете попытаться подумать о том, как человек будет делить. Для 1/11 это говорит о том, сколько раз 11 вписывается в один. Нет, так что вы go меньше. Сколько раз 1.1 вписывается в 1? Нет, так что вы go меньше. Сколько раз 0,11 вписывается в 1? На этом этапе вы используете предыдущий трюк. 11 вписывается в 100, поэтому мы go больше. 11 * 2 вписывается в 100, поэтому мы go больше. Вы можете продолжать идти, пока не поймете, что 11 * 10 не вписывается в 100. Вы можете продолжать делать это, пока не достигнете уровня точности. Конечно, он хакерский и медленный, но работает. Вы даже можете выполнить точную математику, пройдя уровень точности 16-ди git.
Почему это происходит, посмотрите на этот ответ: { ссылка }

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