Euler数java中的精度
我正在做一个计算欧拉数的代码,但精度不高。如果我的i(变量到阶乘)是40,代码返回无穷大,但是,20或30代码正确返回数字 我的代码Euler数java中的精度,java,Java,我正在做一个计算欧拉数的代码,但精度不高。如果我的i(变量到阶乘)是40,代码返回无穷大,但是,20或30代码正确返回数字 我的代码 double e = 1; for (int i = 1; i < 18; i++) { double j = (double)(E.factorial(i)); double k = 1 / j; e = e + k; } double e=1; 对于(
double e = 1;
for (int i = 1; i < 18; i++)
{
double j = (double)(E.factorial(i));
double k = 1 / j;
e = e + k;
}
double e=1;
对于(int i=1;i<18;i++)
{
双j=(双)(E.阶乘(i));
双k=1/j;
e=e+k;
}
您应该用BigDecimal
替换double
。这将使代码更加精确
BigDecimal e = 0;
BigDecimal demo = 1;
for (int i = 1; i < 400; i++) {
e += demo;
demo /= i;
}
bigdecime=0;
BigDecimal=1;
对于(int i=1;i<400;i++){
e+=演示;
demo/=i;
}
使用BigDecimal而不是double。
解决方案: 在这里,您可以在MathContext('precision',..)中设置精度
final static int LASTITER=17;
公共静态void main(字符串[]args){
MathContext mc=新的MathContext(20,取整模式,半向上);
BigDecimal结果=BigDecimal.0;
对于(int i=0;i我认为,E.factorial
返回long
作为结果,为了提高精度,请尝试以下代码:
double e = 0;
double tmp = 1;
for (int i = 1; i < 400; ++i) {
e += tmp;
tmp /= i;
}
double e=0;
双tmp=1;
对于(int i=1;i<400;++i){
e+=tmp;
tmp/=i;
}
只要原语类型double的最大值只能为“1.7976931348623157e+308”(64位精度),您就需要使用BigDecimal才能达到精度
使用BigDecimal
代替建议的double
,对于超过常规数据类型中可容纳的最大值的数字精度,您应该使用BigDecimal。尽管如此,我不确定您的E.factorial(I)是否函数由您控制,所以您可能很难适应使用BigDecimal。
double e = 0;
double tmp = 1;
for (int i = 1; i < 400; ++i) {
e += tmp;
tmp /= i;
}