4

updは私のバージョンを最後の説明に入れました

仮数と指数を 10 進数に変換する必要があります。これは私がそれをコーディングした方法です:

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

field.Decimal.Mantissaは整数ですが、Math.Pow(10, field.Decimal.Exponent)2 倍なので、10 進数にキャストすると精度が失われるのではないかと心配しています。

を生成する型に対して独自のPow関数を作成する必要がありますか?integerdecimal

何を提案しますか?私はこの関数を 1 秒間に何十回も呼び出すため、パフォーマンスに気を配っています。とても醜いが高速なソリューションが強く望まれています!

ここではお金を扱っているので、精度にも気を配っています。

これは私が今コーディングしたものですが、おそらく誰かがより良いものを提案できます:

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;
    }
}
4

1 に答える 1

1

あなたが望むほとんどのことをするコンストラクタdecimalがあります。decimalしかし、あなたの表現とは異なるの内部表現を使用しています。コンストラクターのパラメーターにexponent直接変換できるため、負の数値の変換は非常に簡単です。scaleしかし、正exponentの場合、乗算は自分で行う必要があると思います。

それが実際にあなたのコードよりも速いかどうかはわかりませんが。そして、それは確かに読みにくいので、あなたの解決策はうまくいくかもしれません.

于 2012-04-03T13:52:01.293 に答える