Вы делаете предположения о том, как serialize
работает.
Очевидный способ хранения double (и «float» в большинстве языков, отличных от C, будет double) - это использование 8 байтов. Насколько я знаю, большинство нормальных двоичных сериализаций будет делать это.
(Да, я немного злоупотребляю словом "double" для обозначения 64-разрядной двоичной плавающей запятой IEEE 754.)
Вместо этого PHP пытается сохранить десятичное представление, что затрудняется тем фактом, что невозможно точно представить 1.7 в двоичном виде. Оказывается, самое близкое представление точно 1.6999999999999999555910790149937383830547332763671875.
Я не знаю, почему PHP предпочитает давать точное представление вместо кратчайшего представления, которое преобразуется обратно в одно и то же двойное число (вам, разумеется, не нужно больше 17 цифр или около того, и есть более эффективные алгоритмы, чтобы сделать вас короче номера). Одна из возможностей состоит в том, что она хочет сохранить точную семантику в случае, если целевая система использует другое представление с плавающей запятой (например, если ваша целевая система использует 128-битные "двойные-двойные", 1.7 - это другое число).
Все это говорит о том, что 1700 - это только на один байт больше, чем 1.7, но предлагает гораздо большую точность.