При установке значения для индекса с использованием формулы для вычисления индекса, что-то вроде
$arr[((40.9+0.00004)*100000)] = 1;,
в ожидаемом результате мой массив должен иметь следующее значение индекса: [4090004]=>1;
взамен получил [4090003]=>1.
Может кто-нибудь дать мне представление о том, что происходит?
Мне удалось обойти это, преобразовав индекс в строку $arr[(string) ((40.9+0.0004)*100000)] = 1;, но я хотел бы понять лежащую в основе механику, которая вызвала это.
ОБНОВИТЬ
Это не связано напрямую с этим вопросом Математика с плавающей запятой не работает? - хотя ответ может быть связан с этой ошибкой с плавающей запятой, я пытаюсь понять, как она на меня влияет.
Прочтите предупреждение здесь - php.net/manual/en/language.types.float.php
@ceejayoz, я только что отредактировал формулу, теперь вы увидите, о чем я говорю (должно было быть 0,00004)
Ваша проблема остается той же - это то, что происходит с математикой с плавающей запятой.
@ceejayoz это не имеет ничего общего с математикой, если вы echo ((40.9+0.00004)*100000), результат будет 4090004, это связано с установкой индекса моего массива с плавающей точкой
«Результаты моих вычислений с плавающей запятой не имеют ничего общего с математикой с плавающей запятой» - это утверждение ... интересно.
(Вот попробуйте это, и вы увидите, что происходит: echo number_format((float) ((40.9+0.00004)*100000), 20);. На моем компьютере это 4,090,003.99999999953433871269.
Я думаю, он говорит, что расчет в ключе массива, а не в ключе массива, отличается: ideone.com/2tlPxj
@IdontDownVote. Скорее всего, это внутреннее эхо (и, следовательно, преобразование в строку) раундов, и ключ массива усекается. php.net/manual/en/language.types.array.php указывает, что "числа с плавающей запятой также приводятся к целым числам, что означает, что дробная часть будет усечена. Например, ключ 8.7 будет фактически сохранен под номером 8".
Вкратце: ваш номер не точно 4090004; он получит округлый с помощью некоторых операций, таких как приведение к строке, и усеченный (отбрасываемые незначительные биты) с помощью других операций, таких как приведение к целому числу.






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