gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 12:50:03 27 4
gpt4 key购买 nike

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

我应该为 integer 类型编写自己的 Pow 函数来生成 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;
}
}

最佳答案

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

尽管我不知道它是否真的比您的代码更快。而且它的可读性肯定会低得多,因此您的解决方案可能没问题。

关于c# - 将(长尾数)和(sbyte 指数)转换为十进制,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9993417/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com