4

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)是双精度的,所以我担心在转换为十进制时会丢失精度。

我应该为将产生的类型编写自己的Pow函数吗?integerdecimal

你有什么建议?我关心性能,因为我每秒调用这个函数几十万次!非常需要如此丑陋但快速的解决方案!

我关心的是精度,因为我在这里用钱工作。

这是我刚刚编码的,但可能有人可以提出更好的建议:

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构造函数的参数。但是对于 positive exponent,我认为您需要自己进行乘法运算。

虽然我不知道它是否真的会比你的代码快。而且它的可读性肯定会低得多,所以你的解决方案可能没问题。

于 2012-04-03T13:52:01.293 回答