【问题标题】:convert (long mantissa) and (sbyte exponent) to decimal将(长尾数)和(sbyte 指数)转换为十进制
【发布时间】:2012-04-17 02:47:15
【问题描述】:

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) 是双精度的,所以我担心在转换为十进制时会丢失精度。

我是否应该为将产生decimalinteger 类型编写自己的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;
    }
}

【问题讨论】:

  • 你看过这个SO question,尤其是this answer吗?
  • @Matt 是的,我做到了,它似乎不适用于负整数指数......但是很容易修改以支持负指数。但请注意,我的问题要容易得多。我不需要以小数的幂来提高小数。我需要提高 sbyte 的力量!所以我使用整数。而且我希望可能存在一些简单的解决方案(可能使用像

标签: c# decimal numeric-conversion


【解决方案1】:

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

虽然我不知道它是否真的比你的代码更快。而且它的可读性肯定会低得多,所以你的解决方案可能没问题。

【讨论】:

  • 我认为我的描述示例会更直观,甚至可能更快一点。
  • 你说你关心性能。在这种情况下,您应该分析代码的各种版本,而不仅仅是猜测。
  • 我不太在乎。我更喜欢在容易的时候有表现。只有当性能问题很明显或者我有太多空闲时间时,我才会进行分析:)
猜你喜欢
  • 1970-01-01
  • 2022-06-24
  • 1970-01-01
  • 2013-02-27
  • 1970-01-01
  • 1970-01-01
  • 2020-08-06
  • 2010-10-16
相关资源
最近更新 更多