【问题标题】:How do I check how many digits my answer has?如何检查我的答案有多少位数?
【发布时间】:2015-05-22 22:25:44
【问题描述】:

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

例如,如果我调用 getValue() 方法 20 次,第 20 次得到的答案是 8 位数字,我该如何检查答案并停止代码?

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

问题如下:

使用幂法计算Leslie矩阵A的最大特征值。当精度达到8位时,幂法的迭代应该停止。莱斯利矩阵模型可以写成

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

【问题讨论】:

    标签: java algorithm floating-point double iteration


    【解决方案1】:

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

    【讨论】:

    • 我可以发这么多。
    【解决方案2】:

    double 以这种方式永远不会足够精确。了解答案准确性的唯一方法是对您正在执行的操作进行数学分析,并在保证误差小于一定数量时停止。

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

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

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

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

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

    【讨论】:

    • 哦,我明白了!所以我需要从数学上算出我的方法何时能保证答案正好是 8 位数字?
    • @Shan 确保您阅读了编辑。第二段比第一段更容易解决。忘记我的第一个版本
    • 即使序列收敛,连续的差异也可能过早停止过程。了解收敛 至关重要。
    【解决方案3】:

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

    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 的小数部分。

    【讨论】:

    • 这行不通。假设他的方法返回 6.123456789996 并且 正确 答案是 6.12345679000000 您的方法不会在应该停止的时候停止。
    • 伟大的发现。我没考虑过
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-30
    • 1970-01-01
    • 2012-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多