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

时间:2012-04-03 12:37:09

标签: c# decimal numeric-conversion

更新将我的版本放在最后的说明中

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

// 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生成integer类型的decimal函数编写自己的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; } } 函数吗?

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

我关心精确度,因为我在这里工作。

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

{{1}}

1 个答案:

答案 0 :(得分:1)

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

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