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 ?
Réponses
Trop de publicités?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.
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.