【发布时间】: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) 是双精度的,所以我担心在转换为十进制时会丢失精度。
我是否应该为将产生decimal 的integer 类型编写自己的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