Странная ошибка PHP

При установке значения для индекса с использованием формулы для вычисления индекса, что-то вроде $arr[((40.9+0.00004)*100000)] = 1;, в ожидаемом результате мой массив должен иметь следующее значение индекса: [4090004]=>1; взамен получил [4090003]=>1.

Может кто-нибудь дать мне представление о том, что происходит?

Мне удалось обойти это, преобразовав индекс в строку $arr[(string) ((40.9+0.0004)*100000)] = 1;, но я хотел бы понять лежащую в основе механику, которая вызвала это.

ОБНОВИТЬ

Это не связано напрямую с этим вопросом Математика с плавающей запятой не работает? - хотя ответ может быть связан с этой ошибкой с плавающей запятой, я пытаюсь понять, как она на меня влияет.

(Между прочим, я получаю [4090039]=>1, когда пробую.)

ceejayoz 22.10.2018 22:05

Прочтите предупреждение здесь - php.net/manual/en/language.types.float.php

line88 22.10.2018 22:07

@ceejayoz, я только что отредактировал формулу, теперь вы увидите, о чем я говорю (должно было быть 0,00004)

Yehuda Schwartz 22.10.2018 22:15

Ваша проблема остается той же - это то, что происходит с математикой с плавающей запятой.

ceejayoz 22.10.2018 22:16

@ceejayoz это не имеет ничего общего с математикой, если вы echo ((40.9+0.00004)*100000), результат будет 4090004, это связано с установкой индекса моего массива с плавающей точкой

Yehuda Schwartz 22.10.2018 22:25

«Результаты моих вычислений с плавающей запятой не имеют ничего общего с математикой с плавающей запятой» - это утверждение ... интересно.

ceejayoz 22.10.2018 22:29

(Вот попробуйте это, и вы увидите, что происходит: echo number_format((float) ((40.9+0.00004)*100000), 20);. На моем компьютере это 4,090,003.99999999953433871269.

ceejayoz 22.10.2018 22:33

Я думаю, он говорит, что расчет в ключе массива, а не в ключе массива, отличается: ideone.com/2tlPxj

user10226920 22.10.2018 22:35

@IdontDownVote. Скорее всего, это внутреннее эхо (и, следовательно, преобразование в строку) раундов, и ключ массива усекается. php.net/manual/en/language.types.array.php указывает, что "числа с плавающей запятой также приводятся к целым числам, что означает, что дробная часть будет усечена. Например, ключ 8.7 будет фактически сохранен под номером 8".

ceejayoz 22.10.2018 22:37

Вкратце: ваш номер не точно 4090004; он получит округлый с помощью некоторых операций, таких как приведение к строке, и усеченный (отбрасываемые незначительные биты) с помощью других операций, таких как приведение к целому числу.

deceze 23.10.2018 09:57
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
10
42
0

Другие вопросы по теме