Attention aux types de données money et smallmoney !

En effet, ces deux types de données produisent des erreurs de calculs.
Voici un petit test pour révéler cela :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
DECLARE @mon1 smallmoney,
       @mon2 smallmoney,
       @mon3 smallmoney,
       @mon4 smallmoney,
       @num1 decimal(19,4),
       @num2 decimal(19,4),
       @num3 decimal(19,4),
       @num4 decimal(19,4)
 
SELECT @mon1 = 100
       , @mon2 = 339
       , @mon3 = 10000
       ---
       , @num1 = 100
       , @num2 = 339
       , @num3 = 10000
 
SELECT @mon4 = @mon1 / @mon2 * @mon3
       , @num4 = @num1 / @num2 * @num3
 
SELECT @mon4 AS money_result
       , @num4 AS numeric_result

Attention donc au choix des types de données !

3 réflexions au sujet de « Attention aux types de données money et smallmoney ! »

  1. Bonjour Kropernic,

    Je pense que la raison est un défaut de précision qui n’est pas signalé à l’affectation et lors des calculs.
    Je ne m’explique pas que cela n’ait pas été corrigé; aussi le type decimal ou numeric convient tout à fait.

    Je ne trouve pas problématique que la division d’un entier par un entier produise un entier.
    C’est le cas dans de nombreux autres langages; je suppose que c’est un standard :)

    @++ ;)

Laisser un commentaire