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

C# 将(长尾数)和(sbyte指数)转换为十进制,c#,decimal,numeric-conversion,C#,Decimal,Numeric Conversion,upd将我的版本放在描述的末尾 我需要把尾数和指数转换成十进制。 我是这样编码的: // long field.Decimal.Mantissa // sbyte field.Decimal.Exponent decimal MDEntryPx = field.Decimal.Mantissa * (decimal)(Math.Pow(10, field.Decimal.Exponent)); 字段.十进制.尾数为整数 但是Math.Pow(10,field.Decimal.Exponent)

upd将我的版本放在描述的末尾

我需要把尾数和指数转换成十进制。 我是这样编码的:

// long field.Decimal.Mantissa
// sbyte field.Decimal.Exponent
decimal MDEntryPx = field.Decimal.Mantissa * (decimal)(Math.Pow(10, field.Decimal.Exponent));
字段.十进制.尾数
为整数 但是
Math.Pow(10,field.Decimal.Exponent)
是双精度的,所以我担心在转换为十进制时会丢失精度

我是否应该为将产生小数的
类型编写自己的
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;
    }
}
有一个能做你想做的事情。但它使用的内部表示形式是
十进制
,这与您的表示形式不同。对于指数为负的数字,转换应该非常简单,因为您可以直接将其转换为构造函数的
scale
参数。但是对于正的
指数
,我想你需要自己做乘法


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

您是否特别注意过这个问题?@Matt是的,我注意到了,它似乎不适用于负整数指数。。。但是,很容易修改以支持负指数。但请注意,我的问题要简单得多。我不需要用十进制数的幂来提高十进制数。我需要长时间提高sbyte的力量!所以我用整数。我希望可能存在一些简单的解决方案(可能使用低级指令,比如我认为我的描述示例会更直观,甚至可能更快。你是说你关心性能。在这种情况下,你应该分析代码的各种版本,而不仅仅是猜测。我不太在乎。我更喜欢在容易的时候有性能。我只会分析当性能问题很明显或者我有太多空闲时间时:)