Попробуйте запустить в php5 такой код: Код (Text): echo serialize(.1000000000000123456789); Результат противоречит всем логичным ожиданиям.
Можно подумать, что тут все такие фантазеры, что увидав аватарку, застеснялись мне отвечать. Да тут кроме красивого домена и некчемных правил ни чего нету.
можно подумать что ты тут супер феномен извложил. (зы: если больше ничего тут нету кроме домена и правил, то хрена ты тут забыл тогда? развелось блин умников ждущих толковых ответов на бестолковые вопросы)
а че.весело... hosting(440hz):~$>php -r "echo unserialize(serialize(.1000000000000123456789));" 0.10000000000001 =)
в пхп.ини - параметр serialize_precision Как дети, право слово, как будто floating point впервые увидели.
У меня получается следующее Код (Text): d:0.10000000000001234290447627017783815972506999969482421875; Исходная точность уменьшена и добавлено 40 байт мусора. Здась надо два параметра.
Еще раз покажу, что происходит в моем примере: serialize меняет float 0.1000000000000123456789 на string 0.10000000000001234290447627017783815972506999969482421875 Видите разницу? Вы ожидали, что serialize отрежит от исходного числа последние 5 цифр, а на их место поставит 40 цифр мусора? Если для вас это вполне закономерно, то объясните мне, в чем тут прикол... Вот еще пример: Код (Text): $a=.11; $b=$a*10; echo serialize($a)."<br>"; echo serialize($b)."<br>"; Вот его результат: Десятичные числа, при умножении на 10, сдвигаются на 1 регистр влево. Для мусорного хвоста это правило не действует. И что, это тоже логичное поведение float?
Код (Text): hosting(root):/var/log/nginx#>php -r " echo unserialize(serialize('.10000000000123456789'));" .10000000000123456789 я вижу полет мысли, но не вижу решения. =)
440HzВы предлагаете ковычки... Но это не поможет, если нам надо сохранить массив вещественных чисел. Мусорный хвост лепится к каждому числу и неопраданно расходует память.
Код (Text): hosting(root):/var/log/nginx#>php -r " ini_set('serialize_precision',10); echo unserialize(serialize(.123456789));" 0.123456789
freeneutron, думаю, я щас вас сильно удивлю : PHP: <?php $a = (0.7+0.1)*10; $b = 8.0; var_dump($a, $b, ($a == $b)); ?> Код (Text): float(8) float(8) bool(false)
TheShock PHP: <?php $a = (0.7+0.1)*10; echo serialize($a); ?> Я еще с дества помню что в double (float в php это double) всегда допускается погрешность. Это связано с работой процессора, а не с языком программирования.
[vs] и TheShock Погрешность о которой вы говорите - это неопределенность в последнем регистре. Про это написано в руководстве к любому языку, работающему с вещественными типами ограниченной точности. Но тут дело не в типе, дело в функции serialize(), которая зачем-то прилепляет мусорный хвост к вещественным числам, причем длинна этого хвоста привышает длинну мантисы - значащей части float.
freeneutron Всё просто, настройка serialize_precision, она задаёт точность, с которой вещественные числа сериализуются. Это вполне нормальное поведение, поскольку float всёравно хранится с N'ным кол-вом знаков в памяти.