2012-01-13 2 views
3

Как обычно обсуждается (например, здесь Storing 0.00001 in MySQL), тип данных DECIMAL должен использоваться для полей, где требуется точность/правильность, например баланс счета.Обработка MySQL DECIMAL в PHP

Мне было интересно, как PHP обрабатывает эти значения и, если они внутренне обрабатываются как float, если есть еще проблема при чтении этих значений из базы данных, выполнении некоторых вычислений и их повторной записи. Если да, то как мы можем заставить PHP сохранить точность в такте?

+0

Теперь мы выполняем все вычисления внутри запросов MySQL при вводе их в базу данных. Некоторая неточность все еще остается, поэтому, возможно, проблема лежит где-то в другом месте, но это другой вопрос, который я предполагаю. –

ответ

3

Эта переменная, вероятно, является исходной строкой в ​​PHP (при чтении из объекта результата MySQL). В общем случае для типа данных с плавающей запятой PHP нельзя полагаться, чтобы сохранить точное десятичное значение. Вы должны использовать библиотеку математики произвольной точности, такую ​​как GMP. (Когда вы выбираете строку объекта результата, передайте значение столбца DECIMAL в соответствующий конструктор, а затем оперируйте его, используя функции, предоставляемые библиотекой, которую вы используете.)

Чтобы больше углубляться: предположим, у вас есть сумма, хранящаяся в базе данных, в столбце DECIMAL(6, 4). Вы хотите получить это в PHP, чтобы что-то сделать с ним. Вы отправляете запрос для извлечения этого столбца. Вы выбираете первую строку запроса в ассоциативный массив. Предположим, что значение из этой строки равно 2.5674. Ваш массив теперь что-то вроде array('MyDecimal' => '2.5674') (номер отображается как строка). Вы используете (насколько я могу судить) , чтобы преобразовать эту строку в ресурс GMP. Теперь вы можете делать математику с этим номером, используя другие функции GMP. Если вы хотите сохранить номер GMP, вы можете преобразовать его обратно в строку с помощью gmp_strval() (возможно, вам не нужно это делать, если вы используете слой абстракции базы данных, который может обрабатывать ресурсы GMP).

1

Вы можете попробовать использовать произвольные точности функции:

http://php.net/manual/en/book.bc.php

Другой вариант для хранения значения, как INT, а затем преобразовать их, когда они должны быть отображены (т.е. делить на сто).

Смежные вопросы