mXparser округление результата - PullRequest
0 голосов
/ 28 января 2020

Я пытаюсь mXparser в приложении android, и у меня почти все работает. Но если я проанализирую следующее выражение «10/3», то оно вернется: 3.3333333333 5 . Почему это округление в конце? и как мне сказать mXparser вернуть 3.3333333333 3 вместо?

Я пишу приложение, используя kotlin и добавил mXparser через Maven .

В качестве альтернативы, вы знаете о лучшей / более используемой / более поддерживаемой библиотеке математического парсера для Android?

Ответы [ 2 ]

2 голосов
/ 28 января 2020

Причина в том, что компьютеры вычисляют в базе 2, а не в базе 10. Число 10/3 имеет бесконечное расширение как в базе 2, так и в базе 10, что означает, что оно должно быть усечено. Десятичное расширение 10/3 составляет 3.333 ..., которое при его сокращении упрощается до 3-х; в то время как двоичное расширение равно 11.010101010101 ... и когда вы обрезаете его и конвертируете обратно в десятичное, вполне вероятно, что вы можете получить 5 в конце. Я не уверен, что вы можете обойти это при использовании компьютера, поскольку компьютеры должны использовать двоичный файл, а также они должны усекать двоичное расширение.

1 голос
/ 03 февраля 2020

Любая система, основанная на IEEE 754 двойной точности, даст тот же ответ. Это включает в себя все основные языки программирования. Это очень частый вопрос. См., Например, Не работает ли математика с плавающей запятой?

Решение состоит в том, чтобы никогда не использовать метод Double.toString () по умолчанию для вывода. Используйте и выведите с указанием c числа десятичных знаков, и проблема исчезнет.

Более сложное решение состоит в использовании рационального представления ваших чисел, поэтому результат 10/3 хранится внутри как рациональное число {numerator:10,denominator:3}. Это работает для basi c arithmeti c, но не может работать с такими функциями, как cos (x) или sqrt (x). Библиотека анализа парсинга Jep имеет опции для разрешения номера рациона. (отказ от ответственности Я один из авторов Jep).

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