将(长尾数)和(sbyte指数)转换为十进制
本文关键字:转换 十进制 指数 长尾 sbyte | 更新日期: 2023-09-27 18:29:55
upd将我的版本放在末尾的描述中
我需要把尾数和指数转换成十进制。这就是我编码的方式:
// 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)
是双倍的,所以我担心在转换为十进制时会失去精度。
我应该为将生成decimal
的integer
类型编写自己的Pow
函数吗?
你有什么建议?我关心性能,因为我每秒调用这个函数成千上万次!非常需要丑陋但快速的解决方案!
我关心的是精确性,因为我在这里与金钱打交道。
这是我刚刚编码的,但可能有人可以提出更好的建议:
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;
}
}
有一个decimal
的构造函数,它几乎可以满足您的需求。但它使用了decimal
的内部表示,这与您的表示不同。对于exponent
为负的数字,转换应该非常简单,因为您可以直接将其转换为构造函数的scale
参数。但对于正exponent
,我认为你需要自己做乘法。
尽管我不知道它是否真的会比你的代码更快。而且它的可读性肯定会差很多,所以您的解决方案可能很好。