Интерблог

Принцип неопределённости в PHP - праздник продолжается!
Автор: Ognezmej. Опубликовано: 12 Мая 2012

Попробуйте выполнить простенький код:

echo (106801004500603);

Понравилось? PHP считает, что он самый умный, и ему виднее, в каком формате сохранять число. Оно, конечно, и ладно бы, но рассмотрим пару задач.

 

Первая задача - вывести это самое число. Ни echo(), ни print() не выдадут ничего, кроме 1.068010045006E+14. Мы, однако же, не дураки, переведём число в формат string, и... получим то же самое. Слава-те-господи, в PHP существует функция number_format(), и number_format (106801004500603,0,'','') выдаст нам именно то, что мы хотим.

 

Вторая задача - занести это число в MYSQL. Вы уже поняли, что это не так просто, как кажется. Допустим, у нас некая таблица test, число надо записать в поле val. Первые четыре примера - если поле val - строковое, такое часто бывает, например, для всяких артикулов и серийных номеров, которые могут быть как просто числами, так и с наличием букв:

mysql_query('INSERT `test` SET `val`="106801004500603";'); - записывает 1.068010045006E+14

mysql_query('INSERT `test` SET `val`=106801004500603;'); - записывает 106801004500600

mysql_query('INSERT `test` SET `val`="'. number_format (106801004500603,0,'','') .'";'); - записывает 106801004500603

mysql_query('INSERT `test` SET `val`='. number_format (106801004500603,0,'','') .';'); - записывает 106801004500603

Если поле val - числовое:

mysql_query('INSERT `test` SET `val`="106801004500603";'); - записывает 106801004500600

mysql_query('INSERT `test` SET `val`=106801004500603;'); - записывает 106801004500600

mysql_query('INSERT `test` SET `val`="'. number_format (106801004500603,0,'','') .'";'); - записывает 106801004500603

mysql_query('INSERT `test` SET `val`='. number_format (106801004500603,0,'','') .';'); - записывает 106801004500603

Как видим, избавиться от принудительного форматирования или округления помогает всё тот же number_format(). А сколько ещё открытий чудных...

 

 UPDATE:

Увы, number_fromat() работает только до 15 знаков. Число, состоящее из более, чем 15 знаков, меняется произвольным образом.

echo number_format (106545548010045006503,0,'','');  выводит 106545548010045014016

Я понимаю, что это проблема глобальная, проблема хранения данных в памяти компьютера вообще, но почему нет адекватной функции, чтобы просто тупо перевести длинное число в строку?? А это уже как раз, как я понимаю, сказка о неявном приведении типов... Если ты видишь, какое число передаёшь, заключаешь его в кавычки, и нормальная строка. А если это переменная, которая считывается мало ли откуда и может быть мало ли чем? кавычки вообще ничего не дают...

 

 

Метки: MYSQL, PHP, Кодинг, Советы

Популярные записи

Принцип неопределённости в РНР

Принцип неопределённости в MYSQL

Недолёт

А ещё AJAX нужен для...

Принцип неопределённости в PHP - праздник продолжается!

Эмуляция плавности в ActionScript.

Программная анимация в ActionScript

Анимация при наведении в ActionScript

Использование кодировки UTF-8

Буквицца

Архив записей  

2019

Янв  Фев  Мар  Апр  Май  Июн

2018

Янв  Фев  Мар  Апр  Май  Июн

Июл  Авг  Сен  Окт  Ноя  Дек

2017

Янв  Фев  Мар  Апр  Май  Июн

Июл  Авг  Сен  Окт  Ноя  Дек

2016

Янв  Фев  Мар  Апр  Май  Июн

Июл  Авг  Сен  Окт  Ноя  Дек

2015

Янв  Фев  Мар  Апр  Май  Июн

Июл  Авг  Сен  Окт  Ноя  Дек

2014

Янв  Фев  Мар  Апр  Май  Июн

Июл  Авг  Сен  Окт  Ноя  Дек

2013

Янв  Фев  Мар  Апр  Май  Июн

Июл  Авг  Сен  Окт  Ноя  Дек

2012

Янв  Фев  Мар  Апр  Май  Июн

Июл  Авг  Сен  Окт  Ноя  Дек

2011

Янв  Фев  Мар  Апр  Май  Июн

Июл  Авг  Сен  Окт  Ноя  Дек

2010

Янв  Фев  Мар  Апр  Май  Июн

Июл  Авг  Сен  Окт  Ноя  Дек

2009

Янв  Фев  Мар  Апр  Май  Июн

Июл  Авг  Сен  Окт  Ноя  Дек