Erreur de calcul décimal SQL Server

Je comprends que ce n'est pas la question typique ici, désolé à ce sujet.

Si récemment, j'ai rencontré une chose étrange dans Microsoft SQL Server. Il semble arrondir les calculs décimaux (30, 10) au sixième chiffre après la virgule décimale. C'est très simple de le montrer:

select 0.0000009 * 1; -- 0.0000009, perfect select cast(0.0000009 as real) * cast(1 as real); -- 9E-07, that's also 0.0000009, sehr gut! select cast(0.0000009 as decimal(18,10)) * cast(1 as decimal(18,10)); -- same number – no surprise -- but: select cast(0.0000009 as decimal(30,10)) * cast(1 as decimal(30,10)); -- yields 0.000001! 

Mais laissez-moi aller de l'avant:

 select cast(0.0000008 as decimal(30,10)) * cast(1 as decimal(30,10)); -- 0.000001, same thingselect cast(0.0000007 as decimal(30,10)) * cast(1 as decimal(30,10)); -- 0.000001, same thing select cast(0.0000005 as decimal(30,10)) * cast(1 as decimal(30,10)); -- 0.000001, same thing -- select cast(0.0000004999 as decimal(30,10)) * cast(1 as decimal(30,10)); -- 0.000000! why the hell is it rounding!? -- and the crown jewel: select cast(0.00000049999 as decimal(30,10)) * cast(1 as decimal(30,10));-- 0.000001, rounded up to get the same thing as above, insane! 

Au début, je pensais que c'était une simple erreur de calcul ou de représentation binary décimale, donc j'ai commencé par creuser l'logging réel et voir le vidage de la memory hexadécimale là ( histoire complète ici ). Mais bien sûr cela n'a pas aidé et j'ai réalisé la raison quand j'ai essayé le deuxième bloc de code ci-dessus pour arriver à la conclusion qu'il y a un arrondissement quelque part dans le process.

Juste par curiosité – parce que je rapportais déjà à Microsoft – que feriez-vous, comment aller de l'avant enquêter sur cette erreur? J'aimerais savoir quelles sont les opérations en arrière-plan.