C# 将(长尾数)和(sbyte指数)转换为十进制
upd将我的版本放在描述的末尾 我需要把尾数和指数转换成十进制。 我是这样编码的:C# 将(长尾数)和(sbyte指数)转换为十进制,c#,decimal,numeric-conversion,C#,Decimal,Numeric Conversion,upd将我的版本放在描述的末尾 我需要把尾数和指数转换成十进制。 我是这样编码的: // long field.Decimal.Mantissa // sbyte field.Decimal.Exponent decimal MDEntryPx = field.Decimal.Mantissa * (decimal)(Math.Pow(10, field.Decimal.Exponent)); 字段.十进制.尾数为整数 但是Math.Pow(10,field.Decimal.Exponent)
// long field.Decimal.Mantissa
// sbyte field.Decimal.Exponent
decimal MDEntryPx = field.Decimal.Mantissa * (decimal)(Math.Pow(10, field.Decimal.Exponent));
字段.十进制.尾数
为整数
但是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;
}
}
有一个能做你想做的事情。但它使用的内部表示形式是十进制
,这与您的表示形式不同。对于指数为负的数字,转换应该非常简单,因为您可以直接将其转换为构造函数的scale
参数。但是对于正的指数
,我想你需要自己做乘法
虽然我不知道它是否真的比你的代码快。而且它的可读性肯定要差得多,所以您的解决方案可能会很好。您是否特别注意过这个问题?@Matt是的,我注意到了,它似乎不适用于负整数指数。。。但是,很容易修改以支持负指数。但请注意,我的问题要简单得多。我不需要用十进制数的幂来提高十进制数。我需要长时间提高sbyte的力量!所以我用整数。我希望可能存在一些简单的解决方案(可能使用低级指令,比如我认为我的描述示例会更直观,甚至可能更快。你是说你关心性能。在这种情况下,你应该分析代码的各种版本,而不仅仅是猜测。我不太在乎。我更喜欢在容易的时候有性能。我只会分析当性能问题很明显或者我有太多空闲时间时:)