2010-09-22 9 views
14

Quel type (Float ou décimal) est le mieux utilisé pour stocker les prix dans une base de données mysql?Float ou décimal pour les prix?

+1

Quelle base de données? Certains comme Oracle n'ont que des décimales. – Mark

+0

Voir [Utiliser flottant ou décimal pour le montant en dollars de l'application comptable?] (Http://stackoverflow.com/questions/61872/use-float-or-decimal-for-accounting-application-dollar-amount "StackOverflow"). – Andrew

+0

C'est pour une base de données mysql mais s'il y a des différences entre les autres, j'aime bien l'entendre. – tom

Répondre

32

Les flottants ne sont pas exacts et peuvent entraîner des erreurs d'arrondi cumulatives. Decimal est le meilleur format pour l'information financière qui doit être exacte.

+3

La décimale n'est pas exacte non plus - mais elle n'est pas exacte dans un comme nous nous attendons. –

+0

Si la signification du commentaire de Michael n'est pas claire, veuillez voir sa réponse ci-dessous. – MaxVT

9

Pour les calculs financiers utilisent décimal

Selon IEEE 754 Floats sont toujours binaires, seuls les nouveaux formats standard de décimales défini IEEE 754R. La plupart des parties binaires fractionnaires ne peuvent jamais égaler la représentation décimale exacte. Tout nombre binaire peut être écrit comme m/2^n (m, n entiers positifs), n'importe quel nombre décimal comme m/(2^n * 5^n). Comme les binaires n'ont pas le facteur premier 5, tous les nombres binaires peuvent être exactement représentés par des décimales, mais pas vice versa.

0.3 = 3/(2^1 * 5^1) = 0.3 

0.3 = [0.25/0.5] [0.25/0.375] [0.25/3.125] [0.2825/3.125] 

    1/4  1/8  1/16  1/32 

Ainsi, pour les calculs financiers utilisent décimal ne flotteront pas

0

Utilisez S'il vous plaît BigDecimal, car il est le meilleur pour les prix, étant donné que quelques centimes sont arrondis correctement dollar.

Joshua Bloch recommande BigDecimal.

+3

Voyez-vous un tag "java" quelque part? –

+0

@Michael tu m'as eu !! . J'utilise pour regarder pour le filtrage des questions plus récentes par Java, donc j'ai eu cette question. –

1

Lorsque nous stockons un nombre dans float, nous n'enregistrons pas le nombre exact, c'est une approximation. La partie entière obtient la priorité et la partie fractionnaire est aussi proche que la taille du type. Donc, si vous avez des calculs et besoin d'un résultat précis, utilisez Decimal.

13

Les prix sont des valeurs décimales, et les calculs sur les sont censés se comporter comme des fractions décimales en ce qui concerne l'arrondissement, littéraux, etc.

C'est exactement ce que font les types de décimales. Les flottants sont stockés en tant que fractions binaires, et ils ne se comportent pas comme des fractions décimales - leur comportement n'est souvent pas celui attendu par les maths décimaux. Lire The Floating-Point Guide pour des explications détaillées. Pour des valeurs monétaires, n'utilisez jamais de type float binaire - surtout si vous avez un type décimal parfaitement bon disponible!