58 votes

Quel type de données dois-je utiliser pour représenter l'argent en C# ?

En C#, quel type de données dois-je utiliser pour représenter les montants monétaires ? Décimal ? Flottant ? Double ? Je veux prendre en considération : la précision, l'arrondi, etc.

84voto

Andrew Hare Points 159332

Utilisez System.Decimal :

Le type de valeur Décimal représente des nombres décimaux allant de positifs 79,228,162,514,264,337,593,543,950,335 à négatif 79,228,162,514,264,337,593,543,950,335. Le type de valeur Décimal est approprié pour les calculs financiers nécessitant un grand nombre de chiffres entiers et fractionnaires significatifs et fractionnaires significatifs et sans erreur d'arrondi d'arrondi. Le type Décimal ne élimine pas la nécessité d'arrondir les chiffres. Il minimise plutôt les erreurs dues aux l'arrondi.

Ni l'un ni l'autre System.Single ( float ) ni System.Double ( double ) son suffisamment précis capable de représenter des nombres à virgule flottante de haute précision sans erreur d'arrondi.

16 votes

J'ai voté pour, mais je ne suis pas d'accord avec la dernière affirmation. Ce n'est pas que float/double ne sont pas assez précis - c'est juste qu'ils utilisent une base inappropriée pour la monnaie. Vous pourriez avoir une valeur de 512 bits en virgule flottante binaire avec plus de précision. précision que décimal - mais il ne serait toujours pas approprié car il ne pourrait pas représenter exactement des valeurs décimales telles que 0,1.

0 votes

Mon erreur - j'ai mélangé les significations dans ma réponse. J'ai utilisé "précis" dans ma déclaration finale non pas pour signifier "précision mathématique" mais plutôt pour exprimer qu'un nombre arrondi (1 dans cet exemple) est "moins précis" que (0,99999_) alors que le nombre attribué à la variable était en fait 0,9999_. Mauvais choix de mots de ma part...

0 votes

Oui, même un flotteur est précis assez. Le problème se pose lors de la conversion du décimal en binaire et inversement. Les deux bases différentes ont des ensembles différents de nombres irrationnels.

4voto

Fiur Points 503

Utilisez la décimale et l'argent dans la BD si vous utilisez SQL.

4voto

cabgef Points 550

En C#, le type Decimal est en fait une structure avec des fonctions surchargées pour toutes les opérations mathématiques et de comparaison en base 10, ce qui permet de réduire les erreurs d'arrondi. Un flottant (et un double), par contre, s'apparente à la notation scientifique en binaire. Par conséquent, les types décimaux sont plus précis lorsque vous connaissez la précision dont vous avez besoin.

Exécutez ceci pour voir la différence dans la précision des 2 :

using System;
using System.Collections.Generic;
using System.Text;

namespace FloatVsDecimal
{
    class Program
    {
        static void Main(string[] args) 
        {
            Decimal _decimal = 1.0m;
            float _float = 1.0f;
            for (int _i = 0; _i < 5; _i++)
            {
                Console.WriteLine("float: {0}, decimal: {1}", 
                                _float.ToString("e10"), 
                                _decimal.ToString("e10"));
                _decimal += 0.1m;
                _float += 0.1f;
            }
            Console.ReadKey();
        }
    }
}

3voto

Dana Holt Points 7150

Décimal est celui que vous voulez.

-4voto

Paulius Points 4148

J'utiliserais int (ou long) et la valeur 1 serait le montant minimal de l'argent réel (exemple : 1 = 1 cent, 100 = 1 dollar, etc.).

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