有十进制计算的库吗,特别是Pow(decimal, decimal)方法?我找不到它可以是免费的或商业的,无论哪种方式,只要有一个。注意:我不能自己做,不能使用for循环,不能使用Math.Pow,Math.Exp或Math.Log,因为它们都需要double s,我不能使用double s。我不能使用级数,因为它会像double s一样精确。
Pow(decimal, decimal)
Math.Pow
Math.Exp
Math.Log
double
gv8xihay1#
其中一个乘数是率:1/率^(天/365)。没有十进制幂函数的原因是因为使用decimal进行计算毫无意义。使用double。请记住,小数点是为了确保你得到精确的算术值,可以 * 精确 * 表示为 * 短 * 十进制数。对于rate和days的合理值,任何其他子表达式的值显然 * 不会 * 精确地表示为短十进制值。您将处理不精确的值,因此请使用为快速计算稍微不精确的值而设计的类型,如double。当计算结果加倍时,无论如何都会偏离几十亿分之一便士。谁在乎呢?你以后会把错误舍入的。用双精度来计算速率。一旦你得到了一个需要重新转换成货币的结果,把结果乘以一万,四舍五入到最接近的整数,转换成小数,然后再除以一万,你就会得到一个精确到小数点后四位的结果,这对于一个财务计算来说应该足够了。
decimal
rate
days
0yycz8jy2#
这是我用的。
output = (decimal)Math.Pow((double)var1, (double)var2);
现在我只是在学习,但这确实有效,但我不知道我是否能正确地解释它。我认为这是将var 1和var 2的输入转换为double,作为math.pow方法的参数。之后,在math.pow前面的have(decimal)将值返回到小数并将值放入输出变量中。我希望有人能纠正我,如果我的解释是错误的,但我所知道的是,它为我工作。
oipij1gg3#
我知道这是一个老线索,但我把它放在这里的情况下,有人发现它时,寻找一个解决方案。如果你不想在转换和自定义实现上浪费时间,你可以安装NuGet DecimalMath.DecimalEx并像DecimalEx.Pow(number,power)一样使用它。
DecimalEx.Pow(number,power)
goqiplq24#
这里是Wikipedia页面,列出了当前的C#数值库。但是TBH我不认为有很多人支持小数http://en.wikipedia.org/wiki/List_of_numerical_libraries一般来说,在这种计算中使用小数是不合适的。是的,它的精度很高,但范围也很小。正如MSDN文档所述,它是用于财务/货币计算的--不幸的是,POW没有太多的需求!当然,你可能有一个特定的问题域,需要超高的精度,所有的数字都在10(28)- 10(-28)之间。但在这种情况下,你可能只需要编写自己的系列计算器,如在评论中链接到的问题。
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);
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位框架中,?
pgvzfuti7#
等等,为什么不能用替身?如果你使用int或其他类型,你可以转换类型:
int a = 1; int b = 2; int result = (int)Math.Pow(a,b);
7条答案
按热度按时间gv8xihay1#
其中一个乘数是率:1/率^(天/365)。
没有十进制幂函数的原因是因为使用
decimal
进行计算毫无意义。使用double
。请记住,小数点是为了确保你得到精确的算术值,可以 * 精确 * 表示为 * 短 * 十进制数。对于
rate
和days
的合理值,任何其他子表达式的值显然 * 不会 * 精确地表示为短十进制值。您将处理不精确的值,因此请使用为快速计算稍微不精确的值而设计的类型,如double。当计算结果加倍时,无论如何都会偏离几十亿分之一便士。谁在乎呢?你以后会把错误舍入的。用双精度来计算速率。一旦你得到了一个需要重新转换成货币的结果,把结果乘以一万,四舍五入到最接近的整数,转换成小数,然后再除以一万,你就会得到一个精确到小数点后四位的结果,这对于一个财务计算来说应该足够了。
0yycz8jy2#
这是我用的。
现在我只是在学习,但这确实有效,但我不知道我是否能正确地解释它。
我认为这是将var 1和var 2的输入转换为double,作为math.pow方法的参数。之后,在math.pow前面的have(decimal)将值返回到小数并将值放入输出变量中。
我希望有人能纠正我,如果我的解释是错误的,但我所知道的是,它为我工作。
oipij1gg3#
我知道这是一个老线索,但我把它放在这里的情况下,有人发现它时,寻找一个解决方案。如果你不想在转换和自定义实现上浪费时间,你可以安装NuGet DecimalMath.DecimalEx并像
DecimalEx.Pow(number,power)
一样使用它。goqiplq24#
这里是Wikipedia页面,列出了当前的C#数值库。但是TBH我不认为有很多人支持小数
http://en.wikipedia.org/wiki/List_of_numerical_libraries
一般来说,在这种计算中使用小数是不合适的。是的,它的精度很高,但范围也很小。正如MSDN文档所述,它是用于财务/货币计算的--不幸的是,POW没有太多的需求!
当然,你可能有一个特定的问题域,需要超高的精度,所有的数字都在10(28)- 10(-28)之间。但在这种情况下,你可能只需要编写自己的系列计算器,如在评论中链接到的问题。
lnxxn5zx5#
对于十进制来说,提高到分数幂似乎毫无意义,但我可以看到提高到整数幂的用途,特别是10 ^n或10^-n来改变数量级。为此,我使用以下方法:
范例:
oalqel3c6#
不使用
decimal
。使用double
代替。根据这个线程,Math.Pow(double,double)是直接从PHP调用的。How is Math.Pow() implemented in .NET Framework?
以下是.NET Framework 4的内容(仅2行)
64-位十进制在此32位编译器中还不是本机的。在未来的64位框架中,?
pgvzfuti7#
等等,为什么不能用替身?如果你使用int或其他类型,你可以转换类型: