php decimal тип данных
How to type decimal in PHP?
I keep a field in the database that has a decimal type.
How can I type this?
It is not working, because return:
Fatal error: Uncaught TypeError: Return value of getPrice() must be an instance of decimal, float returned.
Anyway type decimal not exists.
I can use float for typping, but is this safe and good? The point is that with the float type there can be numerical errors (Float or decimal for prices?).
3 Answers 3
Don’t listen to recommendation to use floats for money values. It’s really dangerous, because floating numbers cannot guarantee the accurate comparison of non-integer values.
Good solution is to use integers with multipliers. The best solution is to create ValueObject which represents type money.
If your prices are less than ten decimal places long, you’re fine.
However:
Never trust floating number results to the last digit, and do not compare floating point numbers directly for equality.
Floating point numbers have limited precision. Although it depends on the system, PHP typically uses the IEEE 754 double precision format, which will give a maximum relative error due to rounding in the order of 1.11e-16. Non elementary arithmetic operations may give larger errors, and, of course, error propagation must be considered when several operations are compounded.
Additionally, rational numbers that are exactly representable as floating point numbers in base 10, like 0.1 or 0.7, do not have an exact representation as floating point numbers in base 2, which is used internally, no matter the size of the mantissa. Hence, they cannot be converted into their internal binary counterparts without a small loss of precision. This can lead to confusing results: for example, floor((0.1+0.7)*10) will usually return 7 instead of the expected 8, since the internal representation will be something like 7.9999999999999991118.
Различные типы чисел в PHP
Работая с числамт следует отметить, что PHP обеспечивает автоматическое преобразование типов данных. Например, если вы присвоите переменной целочисленное значение, тип этой переменной автоматически будет целым числом. На следующей строке кода вы можете назначить строку той же переменной и её тип изменится на строку. Это автоматическое преобразование иногда может нарушить ваш код.
Целые числа PHP
Основные правила определения целого числа:
Функции PHP для проверки целочисленного типа переменной:
Проверим, является ли тип переменной целым числом:
Пример
Результат выполнения кода:
Число с плавающей точкой
В PHP есть следующие функции для проверки того, является ли переменная типом float :
Пример
Результат выполнения кода:
PHP Бесконечность
В PHP любое числовое значение выше PHP_FLOAT_MAX на платформе считается бесконечным.
Функция PHP var_dump() возвращает тип данных и значение:
Пример
Результат выполнения кода:
Специальное значение NAN
Функция PHP var_dump() возвращает тип данных и значение:
Пример
Результат выполнения кода:
Числовые строки в PHP
PHP будет неявно использовать любую действительную числовую строку для числа, когда возникнет необходимость. Следующие примеры помогут вам лучше понять этот процесс:
Пример
Результат выполнения кода:
В предпоследнем случае шестнадцатеричная строка «0xfedd24» не преобразуется в ее десятичное значение потому, что PHP 7 не считает ее допустимой числовой строкой.
Примечание: Примечание: Начиная с PHP 7.0 функция is_numeric() возвращает значение FALSE для числовых строк в шестнадцатеричной форме (например, «0xfedd24» ), поскольку они больше не считаются числовыми строками.
Приведение строк и чисел с плавающей точкой к целым числам
Иногда вам будет нужно преобразовать числовое значение в другой тип данных. В PHP имеется множество функций и методов для этих целей. В большинстве случаев приведение будет выполнено неявно и вам не придется беспокоиться об этом. Но, если вам нужно сделать преобразование, используйте методы, приведенные ниже.
Типы данных в MySQL (сжатый справочник для PHP программиста)
Что и как и как много хранит MySQL?
Данный материал создан специально для программистов, которые быстро смогут определиться какой тип данных лучше выбрать для хранения значений в БД MySQL.
Для затравки, интересная цитата из мануала по MySQL:
«Максимальный размер записи в MyISAM составляет 65534 байтов. Каждый BLOB или TEXT-столбец засчитывается здесь как 5-9 байтов.» — как это трактовать однозначно не понятно. НО ясно что много-примного столбцов в таблицу на засунешь. «Извращенистые программисты» — будьте аккуратны (66000 столбцов вы точно создать не сможете).
UPD: Если найдете ошибку, или я что-то где-то утаил — отпишитесь в комментах, с удовольствием добавлю.
UPD1 В первую очередь (и самый лучший вариант для новичков) прочитать ОФИЦИАЛЬНЫЙ МАНУАЛ dev.mysql.com/doc/refman/5.0/en/data-types.html (спасибо Psyh за прямую ссылку), а здесь вырезка для META обработчиков данных (как в лице программистов так и в лице машинной обработки).
UPD2 В принципе, все что написано ниже, можно прочитать по адресу www.mysql.ru/docs/man/Column_types.html (за ссылку «русского перевода», спасибо artuska).
UPD3 Еще одну неплохую ссылку предоставил 4all: newcontinent.ru/h/mysqlc (материал на русском)
UPD4 Цитата из комментов от egorF:
# 14«Как главный редактор русскоязычного перевода доки на MySQL, я рекомендую в него не заглядывать — он уже сказочно морально устарел.»
Следующий массив вполне понятен PHP программистам.
Да и вообще, любые уважающие себя программисты это поймут.
Например:
‘int’=>Array(‘byte’=>4, ‘min’=>-2147483648, ‘max’=>2147483647, ‘umin’=>0, ‘umax’=>4294967295),
Используется так:
Мне надо сохранить в поле максимальное числовое значение 234 259 000 000 000.
INT — для этого не подходит. Смотрим другие типы и находим, что BIGINT вполне подойдет.
$MYSQL_TYPES=Array(
// INTEGER
// byte — кол-во байт на хранение,
// max/min — предельные значения,
// umax/umin — беззнаковые предельные значения
‘int’ =>Array( ‘byte’ =>4, ‘min’ =>-2147483648, ‘max’ =>2147483647, ‘umin’ =>0, ‘umax’ =>4294967295),
‘bigint’ =>Array( ‘byte’ =>8, ‘min’ =>-9223372036854775808, ‘max’ =>9223372036854775807, ‘umin’ =>0, ‘umax’ =>18446744073709551615),
‘tinyint’ =>Array( ‘byte’ =>1, ‘min’ =>-128, ‘max’ =>127, ‘umin’ =>0, ‘umax’ =>255),
‘smallint’ =>Array( ‘byte’ =>2, ‘min’ =>-32768, ‘max’ =>32767, ‘umin’ =>0, ‘umax’ =>65535),
‘mediumint’ =>Array( ‘byte’ =>3, ‘min’ =>-8388608, ‘max’ =>8388607, ‘umin’ =>0, ‘umax’ =>16777215),
// FLOAT DOUBLE
// Внимание! Не храните денежные значения в этих полях. Деньги надо хранить — в DECIMAL
// у FLOAT ТОЧНОСТЬ ТОЛЬКО 7 ЦИФР. (все остальные цифры «смазываются»)
// у DOUBLE ТОЧНОСТЬ ТОЛЬКО 15 ЦИФР. (все остальные цифры «смазываются»)
// byte — кол-во байт для хранения поля (по-умолчанию)
// max_byte — максимальное кол-во байт для хранения
// negative_min/negative_max — минмаксы для отрицательных чисел
// positive_min/positive_max — минмаксы для положительных чисел
‘float’ =>Array( ‘byte’ =>4, ‘max_byte’ =>8, ‘negative_min’ =>-3.402823466E+38, ‘negative_max’ =>-1.175494351E-38, ‘positive_min’ =>1.175494351E-38, ‘positive_max’ =>3.402823466E+38),
‘double’ =>Array( ‘byte’ =>8, ‘negative_min’ =>-1.7976931348623157E+308, ‘negative_max’ =>-2.2250738585072014E-308, ‘positive_min’ =>2.2250738585072014E-308, ‘positive_max’ =>1.7976931348623157E+308),
// BOOLEAN
// сами все поймете
‘bool’ =>Array( ‘byte’ =>1, ‘true’ =>1, ‘false’ =>0),
‘boolean’ =>Array( ‘byte’ =>1, ‘true’ =>1, ‘false’ =>0),
// VARCHAR
// byte — кол-во байт отведенных для хранения (можно задать меньше)
// min_byte — минимальное кол-во байт в которых может храниться поле (если длина равна 1)
// В MYSQL 5.0.3 и выше, VARCHAR может быть до 65,535 символов.
// length — максимальная длина символов в поле
‘varchar’ =>Array( ‘byte’ =>256, ‘min_byte’ =>2, ‘length’ =>255),
‘char’ =>Array( ‘byte’ =>256, ‘min_byte’ =>2, ‘length’ =>255),
// TEXT
// byte — кол-во байт для хранения поля
// min_byte — минимальное кол-во байт для хранения одного символа (если длина поля равна 1)
// length — максимальное количество символов в поле
‘tinytext’ =>Array( ‘byte’ =>256, ‘min_byte’ =>2, ‘length’ =>255),
‘text’ =>Array( ‘byte’ =>65537, ‘min_byte’ =>3, ‘length’ =>65535),
‘mediumtext’ =>Array( ‘byte’ =>16777218, ‘min_byte’ =>4, ‘length’ =>16777215),
‘longtext’ =>Array( ‘byte’ =>4294967300, ‘min_byte’ =>5, ‘length’ =>4294967296),
‘tinyblob’ =>Array( ‘byte’ =>256, ‘min_byte’ =>2, ‘length’ =>255),
‘blob’ =>Array( ‘byte’ =>65537, ‘min_byte’ =>3, ‘length’ =>65535),
‘mediumblob’ =>Array( ‘byte’ =>16777219, ‘min_byte’ =>4, ‘length’ =>16777215),
‘longblob’ =>Array( ‘byte’ =>4294967300, ‘min_byte’ =>5, ‘length’ =>4294967296),