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

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

概述upd将我的版本放在最后的描述中 我需要将尾数指数转换为十进制. 这是我编码的方式: // long field.Decimal.Mantissa// sbyte field.Decimal.Exponentdecimal MDEntryPx = field.Decimal.Mantissa * (decimal)(Math.Pow(10, field.Decimal.Exponent)); upd将我的版本放在最后的描述中

我需要将尾数和指数转换为十进制.
这是我编码的方式:

// long fIEld.Decimal.Mantissa// sbyte fIEld.Decimal.Exponentdecimal 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参数.但是有了正指数,我认为你需要自己进行乘法运算.

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

总结

以上是内存溢出为你收集整理的c# – 将(长尾数)和(sbyte指数)转换为十进制全部内容,希望文章能够帮你解决c# – 将(长尾数)和(sbyte指数)转换为十进制所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://www.outofmemory.cn/langs/1228890.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-05
下一篇 2022-06-05

发表评论

登录后才能评论

评论列表(0条)

保存