Идеально ли использовать «<=» или «> =» для сравнения чисел с плавающей запятой? - PullRequest
0 голосов
/ 27 ноября 2018

Я знаю, что я не должен использовать == или != для сравнения чисел с плавающей запятой, но я должен использовать другие операторы сравнения, такие как < или <= для их сравнения?

Ответы [ 2 ]

0 голосов
/ 27 ноября 2018

Причина, по которой сравнение чисел с плавающей точкой на равенство часто проблематично, состоит в том, что арифметика с плавающей точкой только приближает к реальной арифметике.Поэтому, если у нас есть два числа x и y, которые были вычислены с помощью арифметики с плавающей точкой, вычисление x == y в общем случае не говорит нам, являются ли два числа x и y , рассчитанный с точной математикой, будет равен.Другими словами, вопрос о том, не дает ли x == y, с уверенностью, того ответа, который мы хотим (если мы не тщательно разработали и не проанализировали код для этой цели).

Та же проблема существует с такими реляционными операторамикак <.Если у нас есть x и y, один или оба из которых отличаются от идеально вычисленных x или y на некоторое небольшое количество, тогда x < y может быть истинным, в то время как x <<em> y неверно или наоборот.

Нет общего решения этой проблемы.В некоторых приложениях ошибка может быть допустимой.В некоторых приложениях может быть возможно получить границу для ошибки с плавающей точкой e , чтобы мы могли доказать, что, скажем, если x < y-e верно, то x <<em> у верно.(Но тогда, если x < y-e ложно, мы не уверены в x <<em> y .) Таким образом, подходящее решение зависит от конкретного приложения.

0 голосов
/ 27 ноября 2018

Для чисел с плавающей запятой вы можете использовать расширение PHP bcmath:

Для математики произвольной точности PHP предлагает двоичный калькулятор, который поддерживает числа любого размера и точности до 2147483647.(или 0x7FFFFFFF) десятичные дроби, если имеется достаточно памяти, представленной в виде строк.

В частности, bccomp() принимает два аргумента.Возвращает 0, если они равны, 1, если первый аргумент больше, и -1, если второй аргумент больше.Третий аргумент указывает, сколько десятичных разрядов точности вы ищете.

bcmath('12.555437830', '12.555437829', 10);
// returns 1

Обратите внимание, что одним из недостатков этой функции является то, что аргументы принимаются как строки, хотя PHP набирает обычно делает это не проблема.

...