Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何检查我的答案有多少位数?_Java_Algorithm_Floating Point_Double_Iteration - Fatal编程技术网

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

Java 如何检查我的答案有多少位数?,java,algorithm,floating-point,double,iteration,Java,Algorithm,Floating Point,Double,Iteration,我试图通过多次调用一个方法来找到最精确的值。如何检查第n次迭代何时给出精度为8位的值。我的方法每次调用时都返回一个double,但当结果的精度为8位数时,我想停止调用它 例如,如果我调用方法getValue()20次,而在第20次调用时,它的答案是8位数字,那么如何检查答案并停止代码 我的方法太长,无法发布,所以一般的解释就足够了 问题如下: 使用幂法计算Leslie矩阵A的最大特征值。当获得8位精度时,幂法的迭代应停止。Leslie矩阵模型可写成 n(k + 1) = An(k), k = 0

我试图通过多次调用一个方法来找到最精确的值。如何检查第n次迭代何时给出精度为8位的值。我的方法每次调用时都返回一个double,但当结果的精度为8位数时,我想停止调用它

例如,如果我调用方法getValue()20次,而在第20次调用时,它的答案是8位数字,那么如何检查答案并停止代码

我的方法太长,无法发布,所以一般的解释就足够了

问题如下:

使用幂法计算Leslie矩阵A的最大特征值。当获得8位精度时,幂法的迭代应停止。Leslie矩阵模型可写成

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;
}
while(true){
nextValue=computeNextValue(以前的值);
if(Math.abs(上一个值-下一个值)

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


即使序列收敛,连续差分也可能过早地停止该过程。了解收敛速度至关重要


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

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

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

的小数部分,我可以发布这么多。哦,我明白了!因此,我需要从数学上计算出我的方法何时能保证答案正好是8位数字?@Shan请务必阅读编辑。第二段比第一段容易得多。忘记我的第一个版本吧,即使序列收敛,连续的差异也可能过早地停止这个过程。知道收敛速度是至关重要的,这是行不通的。假设他的方法返回6.12345678996,正确答案是6.1234567900000。你的方法不会在它应该停止的时候停止。很好的发现。我没有考虑过。