加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-15 21:32:37 所属栏目:百科 来源:网络整理
导读:upd将我的版本放在最后的描述中 我需要将尾数和指数转换为十进制. 这是我编码的方式: // long field.Decimal.Mantissa// sbyte field.Decimal.Exponentdecimal MDEntryPx = field.Decimal.Mantissa * (decimal)(Math.Pow(10,field.Decimal.Exponent)); fiel
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参数.但是有了正指数,我认为你需要自己进行乘法运算.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读