如何检查我的答案有多少位数?

How do I check how many digits my answer has?

我试图通过多次调用一个方法来找到最精确的值。我如何检查第 n 次迭代何时会给出 8 位精度的值。我的方法 returns 每次调用它时都会加倍,但我想在结果有 8 位精度时停止调用它。

例如,如果我调用 getValue() 方法 20 次,并且在第 20 次它有一个 8 位数的答案,我如何检查答案并停止代码?

我的方法太长post,所以一般的解释就足够了。

问题如下:

Use the power method to calculate the largest eigenvalue of the Leslie matrix A. The iteration of the power method should stop when you get 8 digits of accuracy.The Leslie Matrix Model can be written as

n(k + 1) = An(k), k = 0, 1, 2,... and with some n(0) given.

老实说,我不相信有一个通用的答案。你怎么知道答案 7.9999999 比 8.0(可能是 8.00000000000000)更精确?我想这可能在很大程度上取决于您要解决的问题。

double 这种方式永远不够精确。要知道你答案的准确性,唯一的方法是对你正在做的操作进行数学分析,并在保证误差小于一定数量时停止。

但是,如果您知道您的分析将会收敛,则有一点技巧。您可以比较连续的值,看看差异有多大。这是一些伪代码:

while(true) {
    nextValue = computeNextValue(previousValue);
    if(Math.abs(previousValue - nextValue) < ERROR_THRESHOLD) {
        break;
    }
    previousValue = nextValue;
}

@user58697 在评论中提出了一个很好的观点:

Even if the sequence converges, successive difference may stop the process too early. Knowing the convergence rate is vital.

编写程序时请牢记这一点。

您可以使用以下 hack 来检查小数部分。这是完整的代码 -

public class FractionCheck{

     public static void main(String[] args){

        int length1 = findFractionLegth(423423.98476527);
        int length2 = findFractionLegth(428294.31231);

        System.out.println(length1);
        System.out.println(length2);

     }


     public static int findFractionLegth(double number){

        String numberStr = Double.toString(number);
        String fractionalStr = numberStr.substring(numberStr.indexOf('.')+1);

        return fractionalStr.length();
     }

}  

findFractionLegth(double number)方法计算double的小数部分。