convertir (mantisse longue) et (exposant sbyte) en décimal

upd a placé ma version dans la description à la fin

Je dois convertir mantisse et exposant en décimal. Voici comment j’ai codé ça:

// long field.Decimal.Mantissa // sbyte field.Decimal.Exponent decimal MDEntryPx = field.Decimal.Mantissa * (decimal)(Math.Pow(10, field.Decimal.Exponent)); 

field.Decimal.Mantissa est un entier, mais Math.Pow(10, field.Decimal.Exponent) est double, je crains donc de perdre la précision lors de la conversion en décimal.

Devrais-je écrire ma propre fonction Pow pour integer types integer qui produiront un nombre decimal ?

Que suggérerais-tu? Je me soucie de la performance car j’appelle cette fonction des dizaines de milliers de fois par seconde! Des solutions si laides mais rapides sont vivement souhaitées!

Et je me soucie de la précision car je travaille avec de l’argent ici.

C’est ce que je viens de coder, mais quelqu’un peut probablement suggérer quelque chose de mieux:

 class Util { private static readonly decimal[] posPow10 = { 1M, 10M, 100M, 1000M, 10000M, 100000M, 1000000M, 10000000M, 100000000M, 1000000000M, 10000000000M, 100000000000M }; private static readonly decimal[] negPow10 = { 1M, 0.1M, 0.01M, 0.001M, 0.0001M, 0.00001M, 0.000001M, 0.0000001M, 0.00000001M, 0.000000001M, 0.0000000001M, 0.00000000001M, }; public static decimal Pow(decimal mantissa, sbyte exponent) { decimal result = mantissa; if (exponent >= 0) { result *= posPow10[exponent]; } else { result *= negPow10[-exponent]; } return result; } } 

Il y a un constructeur de decimal qui fait à peu près ce que vous voulez. Mais il utilise la représentation interne du nombre decimal , ce qui est différent de votre représentation. La conversion devrait être assez simple pour les nombres avec un exponent négatif, car vous pouvez le traduire directement dans le paramètre scale du constructeur. Mais avec exponent positif, je pense que vous devrez faire la multiplication par vous-même.

Bien que je ne sache pas si ce serait réellement plus rapide que votre code. Et ce serait certainement beaucoup moins lisible, alors votre solution pourrait bien fonctionner.