将(长尾数)和(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)是双倍的,所以我担心在转换为十进制时会失去精度。

我应该为将生成decimalinteger类型编写自己的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;
    }
}

将(长尾数)和(sbyte指数)转换为十进制

有一个decimal的构造函数,它几乎可以满足您的需求。但它使用了decimal的内部表示,这与您的表示不同。对于exponent为负的数字,转换应该非常简单,因为您可以直接将其转换为构造函数的scale参数。但对于正exponent,我认为你需要自己做乘法。

尽管我不知道它是否真的会比你的代码更快。而且它的可读性肯定会差很多,所以您的解决方案可能很好。