Pergunta

Então, eu estou planejando fazer uma aplicação (PHP / MySQL) que lida muito com dinheiro, e eu estou pensando sobre como armazenar e operar com o dinheiro, referindo-se PHP tipo de dados bóia e MySQL decimal.

Eu estava pensando em duas opções. Um deles é para operar e armazenar dinheiro em formato centavos inteiro ($ dólares * 100) a fim de não lidar com inprecisions float e para armazená-lo no DB como inteiro também. A outra é a de armazenar no DB como decimal e usar BC Math em PHP para os cálculos.

Então, eu pesquisei toda a noite para descobrir qual é a melhor opção para uso e não encontrou uma resposta clara. A opção razoável que eu vi foi a um centavos inteiros (que eu realmente não gosto, porque isso implicaria um monte de conversão de dólares para centavos e vice-versa, antes de cada exibição no navegador e antes de armazenar no DB).

Além disso, as pessoas se queixaram sobre MySQL decimais (o MySQL armazena decimais como cordas, opera-los como flutuadores etc.), mas que eram posts antigos. De acordo com a documentação do MySQL, as alças versão atual decimais corretamente, a única reclamação foi que não trunca a fração dos valores que excede o comprimento fração declarada (por exemplo, se você armazenar um valor de 12,326 em uma coluna declarada decimal (9,2)) , mas a partir de minhas investigações arredonda-lo em vez de apenas truncar (12,326 torna-se 12,33), o que é correto, na minha opinião.

E, eu não encontrou qualquer recomendação sobre o armazenamento de dinheiro como decimais e cálculos fazer usando PHP BCMath, e na minha opinião isso é porque poucas pessoas sabem sobre funções matemáticas BC e GMP.

Então, o que seria a melhor opção de uso, considerando precisão, velocidade (velocidade cálculos BCMath, MySQL velocidade decimal vs inteiro) e conforto programação?

Foi útil?

Solução

Eu definitivamente ir para usar interrupções e roteamento tudo através de um objeto de dados de estilo (ORM) que, em seguida, lida com toda a conversão para você. O código do cliente usando o objeto de dados nunca vai precisar para fazer a conversão e não vai se importar, enquanto você não terá problemas com o armazenamento como ints são facilmente defendido pelo DB. Além disso, você pode adicionar o que outros métodos são necessários para o objeto dinheiro (como conversões entre tipos de dinheiro, etc) com bastante facilidade.

Outras dicas

Eu também tive informações constatação de problemas sobre BCMath, então eu pesquisei e escrevi o meu próprio artigo sobre ele: http://www.exploringbinary.com/base-conversion-in-php-using-bcmath/ .

(eu não estou tomando a posição que você deve usar BCMath -. Estou apenas dando-lhe informações)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top