web-dev-qa-db-fra.com

stocker des montants d'argent dans mysql

Je veux stocker 3,50 dans une table mysql. J'ai un flotteur dans lequel je le stocke, mais il stocke sous 3,5 et non 3,50. Comment puis-je faire en sorte qu'il ait le zéro de fin?

61
David

Ne stockez pas de valeurs monétaires comme flottant, utilisez le type DÉCIMAL ou NUMÉRIQUE:

Documentation pour les types numériques MySQL

EDIT & clarification:

Les valeurs flottantes sont vulnérables aux erreurs d'arrondi si elles ont une précision limitée, donc à moins que vous ne vous souciez pas d'obtenir seulement 9,99 au lieu de 10,00, vous devez utiliser DECIMAL/NUMERIC car ce sont des nombres à virgule fixe qui n'ont pas de tels problèmes.

94
Morfildur

Ce n'est généralement pas une bonne idée de stocker de l'argent sous forme de flottant car des erreurs d'arrondi peuvent survenir dans les calculs.

Envisagez plutôt d'utiliser DECIMAL (10,2).

37
Andy Joiner

Est-ce vraiment important s'il stocke en 3.5, 3.50 ou même 3.500?

Ce qui est vraiment important, c'est la façon dont il est affiché après sa récupération à partir de la base de données.

Ou est-ce que je manque quelque chose ici?

N'utilisez pas non plus de flotteur, utilisez une décimale. Float a toutes sortes de problèmes d'arrondi et n'est pas très gros.

19
graham.reeds

Pour stocker des valeurs, vous pouvez utiliser un champ DECIMAL (10,2) , puis vous pouvez utiliser le format fonction:

SELECT FORMAT(`price`, 2) FROM `table` WHERE 1 = 1
17
Thiago Belem

Pourquoi voulez-vous stocker "3.50" dans votre base de données? 3.5 == 3.50 == 3.5000 en ce qui concerne la base de données.

Votre présentation et formatage des chiffres/dates/etc doit se faire dans l'application, pas dans la base de données.

5
Andy Shellam

Si vous utilisez des types DECIMAL ou NUMERIC, vous pouvez les déclarer comme par exemple DECIMAL (18, 2), ce qui forcerait 2 décimales même si elles étaient égales à 0. Selon la taille que vous attendez, vous pouvez modifier la valeur du premier paramètre.

5
MatsT

Le binaire ne peut pas représenter avec précision des virgules flottantes avec seulement un nombre limité de bits. Ce n'est pas tellement la perte de données mais en fait des erreurs de conversion .. Voici le manuel donnant des exemples

Vous pouvez le voir en action dans votre navigateur, voyez par vous-même dans cet extrait de code.

<script>

    var floatSum = 0;

    // add 0.1 to floatSum 10 times
    for (var i=0; i<10; i++) {
        floatSum += 0.1;
    }

    // if the repetative adding was correct, the floatSum should be equal to 1
    var expectedSum = 10*0.1; // 1

    // you can see that floatSum does not equal 1 because of floating point error
    document.write(expectedSum + " == " + floatSum + " = " + (expectedSum==floatSum) + "<br />");


    // --- using integers instead ---
    // Assume the example above is adding £0.10 ten times to make £1.00
    // With integers, we will use store money in pence (100 pence (also written 100p) in £1)

    var intSum = 0;

    // add 0.1 to floatSum 10 times
    for (var i=0; i<10; i++) {
        intSum += 10;
    }

    // if the repetative adding was correct, the floatSum should be equal to 1
    var expectedSum = 10*10; // 100

    // you can see that floatSum does not equal 1 because of floating point error
    document.write(expectedSum + " == " + intSum + " = " + (expectedSum==intSum) + "<br />");
    document.write("To display as &pound; instead of pence, we can divide by 100 (presentation only) : &pound;" + intSum/100 + "<br />");
</script>
0
SnellyCat