Неожиданное поведение PHP с плавающей точкой для преобразования int - PullRequest
0 голосов
/ 07 июля 2019

enter image description here

Если вы делаете var_dump ((799-639.20) * 100/799);это даст float (20) как результат.Если я перехожу на конвертацию, я получаю 19. Кто-нибудь может объяснить, что здесь может происходить?

1 Ответ

4 голосов
/ 07 июля 2019

Я не могу говорить с официальной семантикой PHP, но, вполне вероятно:

  • Вычисление (799-639.20)*100/799) приводит к 19.999999999999996447286321199499070644378662109375 из-за использования базовой 64-битной двоичной плавающей запятой IEEE-754.
  • Вывод, показанный с помощью var_dump, не показывает полное значение; округляется до ограниченного числа цифр и показывает «20». Например, он может, по сути, отформатировать номер внутренне, используя 16 значащих цифр, что приводит к появлению «20.00000000000000», а затем удалить завершающие незначительные нули и завершающий «.», Создавая «20».
  • Вычисление (int)(799-639.20)*100/799) сначала производит 19.999999999999996447286321199499070644378662109375, как указано выше, а затем преобразует его в int, который усекает, получая 19.
...