37 votes

Type de données String, Decimal ou Float pour le champ Prix ?

J'ai un champ/colonne de prix (par exemple 15,50 USD) et je me demande si le type de données Rails doit être une chaîne de caractères, une décimale ou une flottante ?

53voto

Tom Points 734
add_column :table, :price, :decimal, :precision => 8, :scale => 2

Le code ci-dessus serait votre meilleure chance.

45voto

Tanel Suurhans Points 1180

Cet argument a toujours deux côtés - les décimaux et les entiers. Les partisans des nombres entiers font valoir que les décimales peuvent ne pas être exactes (lors des conversions) et que l'implémentation de BigDecimal comporte des bogues, parfois même des défaillances.

Pour mon propre projet, j'ai également pris des entiers, je les ai enveloppés dans un conteneur personnalisé, convertissant les cents en montants "réels" et inversement. Au début, cela semblait agréable, mais au bout d'un certain temps, cela est devenu très difficile à utiliser - il faut faire le suivi lorsque l'on a affaire à des centimes, à des chaînes de caractères formatées, etc.

J'ai ensuite opté pour les décimales : le format est toujours le même, je peux facilement convertir le montant en centimes si nécessaire, et je bénéficie des différents algorithmes d'arrondi. Je suis beaucoup plus satisfait des décimales.

Et pour répondre aux questions concernant l'imprécision des décimales - en faisant des recherches sur Google, vous remarquerez que la plupart des bogues sont liés à la conversion des décimales en flottants :) Comme vise l'a déjà mentionné, les flottants ne sont pas précis et vous ne devez jamais convertir vos décimales en flottants. C'est la chose la plus importante dont vous devez vous souvenir lorsque vous utilisez des décimales - vous ne voulez pas perdre la précision par des conversions. Oh et je n'ai jamais rencontré de bogues avec ruby 1.8.7, 1.8.7 et 1.9.1 en utilisant BigDecimal de manière intensive.

11voto

Woot4Moo Points 14245

Cela dépend.

Si vous effectuez des calculs pour des prix d'achat, utilisez une décimale.
Si vous effectuez des calculs techniques, utilisez un flotteur.
Si vous ne faites que stocker les données, utilisez une chaîne de caractères.

11voto

vise Points 4979

Les flotteurs ne sont pas précis :

0.3 - 0.2 - 0.1
=> -2.77555756156289e-17

Ne les utilisez pas, sauf si vous ne stockez que des valeurs.

Si vous avez besoin d'effectuer des calculs, enregistrez le prix en centimes sous la forme d'un nombre entier. Vous pouvez facilement les afficher en USD avec un helper.

7voto

Kevin Sylvestre Points 15551

Je recommande d'utiliser des entiers pour les prix si possible. De nombreux joyaux populaires (comme ActiveMerchant, Money) supposent l'utilisation d'entiers, et il est souvent préférable de stocker les unités de mesure dans une unité de base (comme les cents).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X