MySQL DECIMAL обработка в PHP - PullRequest
       42

MySQL DECIMAL обработка в PHP

3 голосов
/ 13 января 2012

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

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

Ответы [ 2 ]

3 голосов
/ 13 января 2012

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

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

1 голос
/ 13 января 2012

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

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

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

...