微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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函数吗?

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

当我在这里工作时,我关心精确度.

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

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;
    }
}

解决方法

a constructor of decimal可以满足您的需求.但它使用十进制的内部表示,这与您的表示不同.对于具有负指数的数字,转换应该非常简单,因为您可以直接将其转换为构造函数的scale参数.但是有了正指数,我认为你需要自己进行乘法运算.

虽然我不知道它是否真的比你的代码更快.它的可读性肯定会低得多,因此您的解决方案可能会很好.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐