将(long mantissa)和(sbyte exponent)转换为十进制数。

4

更新:我把我的版本放到了描述的结尾。

我需要将尾数和指数转换为十进制。这是我的代码:

// 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函数以生成decimal吗?
您有什么建议?由于我每秒钟要调用这些函数数万次,因此我关心性能!因此,虽然丑陋但快速的解决方案非常受欢迎!
而且我关心精度,因为我正在处理货币。
这就是我刚刚编写的代码,但可能有人可以提出更好的建议:
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;
    }
}

你看过这个stackoverflow问题和尤其是这个答案吗? - Matt
@Matt 是的,我试过了,似乎它不能用于负整数指数...不过很容易修改以支持负指数。但请注意,我的问题要简单得多。我不需要将十进制数提高到十进制数的幂次方。我需要将长整型提高到有符号字节的幂次方!所以我使用整数。我预计可能存在一些简单的解决方案(可能使用低级指令如<<或其他东西...)。 - Oleg Vazhnev
1个回答

1

有一个decimal构造函数几乎可以满足你的需求。但它使用decimal的内部表示方式,这与你的表示方式不同。对于带有负exponent的数字,转换应该相当简单,因为你可以直接将其转换为构造函数的scale参数。但是对于正的exponent,我认为你需要自己进行乘法运算。

虽然我不知道它是否比你的代码实际上更快。而且它肯定会更不易读懂,所以你的解决方案可能还不错。


我认为我的描述中的例子会更直观,而且可能会更快一些。 - Oleg Vazhnev
你说你关心性能。那么,你应该对代码的各个版本进行分析,而不是仅仅猜测。 - svick
我不太在意。我更喜欢在容易的时候追求性能。只有当性能问题明显或者我有太多空闲时间时,我才会进行性能分析 :) - Oleg Vazhnev

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接