ДЕСЯТИЧНАЯ обработка MySQL в PHP


Как обычно обсуждается (например, здесь Хранение 0.00001 в MySQL) ДЕСЯТИЧНЫЙ тип данных следует использовать для полей, где требуется точность/правильность, таких как баланс счета.

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

Author: Community, 2012-01-13

2 answers

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

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

 3
Author: Hammerite, 2012-01-13 11:20:23

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

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

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

 1
Author: pwaring, 2012-01-13 11:16:12