.net 是否有Pow(decimal,decimal)的数学API

vsmadaxz  于 2023-10-21  发布在  .NET
关注(0)|答案(7)|浏览(169)

有十进制计算的库吗,特别是Pow(decimal, decimal)方法?我找不到
它可以是免费的或商业的,无论哪种方式,只要有一个。
注意:我不能自己做,不能使用for循环,不能使用Math.PowMath.ExpMath.Log,因为它们都需要double s,我不能使用double s。我不能使用级数,因为它会像double s一样精确。

gv8xihay

gv8xihay1#

其中一个乘数是率:1/率^(天/365)。
没有十进制幂函数的原因是因为使用decimal进行计算毫无意义。使用double
请记住,小数点是为了确保你得到精确的算术值,可以 * 精确 * 表示为 * 短 * 十进制数。对于ratedays的合理值,任何其他子表达式的值显然 * 不会 * 精确地表示为短十进制值。您将处理不精确的值,因此请使用为快速计算稍微不精确的值而设计的类型,如double。
当计算结果加倍时,无论如何都会偏离几十亿分之一便士。谁在乎呢?你以后会把错误舍入的。用双精度来计算速率。一旦你得到了一个需要重新转换成货币的结果,把结果乘以一万,四舍五入到最接近的整数,转换成小数,然后再除以一万,你就会得到一个精确到小数点后四位的结果,这对于一个财务计算来说应该足够了。

0yycz8jy

0yycz8jy2#

这是我用的。

output = (decimal)Math.Pow((double)var1, (double)var2);

现在我只是在学习,但这确实有效,但我不知道我是否能正确地解释它。
我认为这是将var 1和var 2的输入转换为double,作为math.pow方法的参数。之后,在math.pow前面的have(decimal)将值返回到小数并将值放入输出变量中。
我希望有人能纠正我,如果我的解释是错误的,但我所知道的是,它为我工作。

oipij1gg

oipij1gg3#

我知道这是一个老线索,但我把它放在这里的情况下,有人发现它时,寻找一个解决方案。如果你不想在转换和自定义实现上浪费时间,你可以安装NuGet DecimalMath.DecimalEx并像DecimalEx.Pow(number,power)一样使用它。

goqiplq2

goqiplq24#

这里是Wikipedia页面,列出了当前的C#数值库。但是TBH我不认为有很多人支持小数
http://en.wikipedia.org/wiki/List_of_numerical_libraries
一般来说,在这种计算中使用小数是不合适的。是的,它的精度很高,但范围也很小。正如MSDN文档所述,它是用于财务/货币计算的--不幸的是,POW没有太多的需求!
当然,你可能有一个特定的问题域,需要超高的精度,所有的数字都在10(28)- 10(-28)之间。但在这种情况下,你可能只需要编写自己的系列计算器,如在评论中链接到的问题。

lnxxn5zx

lnxxn5zx5#

对于十进制来说,提高到分数幂似乎毫无意义,但我可以看到提高到整数幂的用途,特别是10 ^n或10^-n来改变数量级。为此,我使用以下方法:

private decimal Pow(decimal value, int power) {
   if(power == 0) return 1.0M;
   var ret = value;
   if(power > 0) {
      for(var _ = 1; _ < power; _++) ret *= value;
   } else {
      for(var _ = 0; _ <= -power; _++) ret /= value;
   }
   return ret;
}

范例:

Debug.Assert(Pow(10.0M, 3) == 1000.0M)
Debug.Assert(Pow(10.0M, -3) == 0.001M);
oalqel3c

oalqel3c6#

不使用decimal。使用double代替。根据这个线程,Math.Pow(double,double)是直接从PHP调用的。
How is Math.Pow() implemented in .NET Framework?
以下是.NET Framework 4的内容(仅2行)

[SecuritySafeCritical]
public static extern double Pow(double x, double y);

64-位十进制在此32位编译器中还不是本机的。在未来的64位框架中,?

pgvzfuti

pgvzfuti7#

等等,为什么不能用替身?如果你使用int或其他类型,你可以转换类型:

int a = 1;
int b = 2;
int result = (int)Math.Pow(a,b);

相关问题