Потратив час, пытаясь выяснить, почему PHP-скрипт дал мне неправильный вывод, оказалось, что цикл в одной конкретной ситуации выполнялся на одну итерацию коротким.
Чтобы объяснить, что происходит: номер версии (2 цифры, например, 1,5 или 2,0) считывается из атрибута XML и умножается на 100. Позднее сценарий выполняет итерации по определенному диапазону, кратному числу версий.
Получается, что 410 == 409
, что вызывает удивление, если сравнивать счетчик с шагом 10 с этим значением.
Что подводит меня к моему вопросу: понимаю ли я что-то неправильно? Конечно, 4.1
, 100
и 410
должны быть хорошо представимы как float и должны быть хорошо конвертируемыми в int без ошибок округления?
Однако в моей системе (с CLI PHP 5.3.2, Zend Engine 2.3.0) следующий тестовый пример
<?
$a = 100 * 4.1;
$b = (string) $a;
$c = (int) $a;
$d = (int)(string) $a;
var_dump($a);
var_dump($b);
var_dump($c);
var_dump($d);
?>
выходы:
float(410)
string(3) "410"
int(409)
int(410)
Сейчас я делаю (int)(string)
конвертацию, которая работает, но это своего рода неприятный хак, который не очень красив и не совсем подходит.
Есть ли лучшее (правильное, без взлома) решение для получения точного результата?