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
関数を作成する必要がありますか?integer
decimal
何を提案しますか?私はこの関数を 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;
}
}