You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java中Double类型更新值无法返回,正确率计算始终显示0%

解决Java中答对题数无法更新的问题

嘿,我一眼就瞅出你遇到的问题啦!这是Java里值传递的经典陷阱,尤其是针对Double这种不可变包装类型的时候。

问题根源

Java里的所有参数传递都是值传递——哪怕是对象类型,传递的也是对象引用的副本。而Double是不可变类,当你在方法里执行right++的时候,其实是创建了一个新的Double对象,把这个新对象的引用赋值给了方法里的局部变量right,但main方法里的那个right变量还是指向原来的初始值(0),所以最后统计的时候永远是0%。

两种可行的解决方案

方案1:让方法返回更新后的数值

最简单的办法就是修改你的答题校验方法,让它返回更新后的答对题数,每次调用后把返回值重新赋值给main里的right变量。示例代码如下:

import java.util.Scanner;
import java.util.Random;

public class Program {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        Random random = new Random();
        double right = 0;
        int totalQuestions = 5; // 假设总共有5道题

        for (int i = 0; i < totalQuestions; i++) {
            // 调用校验方法,接收返回的更新后数值
            right = checkAnswer(right, scanner, random);
        }

        double accuracy = (right / totalQuestions) * 100;
        System.out.printf("you got %.1f%% correct.%n", accuracy);
        scanner.close();
    }

    // 修改方法,返回更新后的答对数量
    private static double checkAnswer(double right, Scanner scanner, Random random) {
        // 生成题目逻辑,比如随机加法题
        int a = random.nextInt(10);
        int b = random.nextInt(10);
        System.out.printf("%d + %d = ? ", a, b);
        int userAnswer = scanner.nextInt();

        if (userAnswer == a + b) {
            System.out.println("答对啦!");
            right++; // 答对就计数+1
        } else {
            System.out.println("答错了,正确答案是" + (a + b));
        }
        return right; // 返回更新后的数值
    }
}

方案2:使用可变容器(比如自定义计数器类或数组)

如果你不想每次都返回赋值,可以用一个可变的引用类型来传递计数,比如自定义一个简单的计数器类:

import java.util.Scanner;
import java.util.Random;

public class Program {
    // 自定义可变计数器类
    static class Counter {
        private double value;

        public void increment() {
            value++;
        }

        public double getValue() {
            return value;
        }
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        Random random = new Random();
        Counter rightCounter = new Counter();
        int totalQuestions = 5;

        for (int i = 0; i < totalQuestions; i++) {
            checkAnswer(rightCounter, scanner, random);
        }

        double accuracy = (rightCounter.getValue() / totalQuestions) * 100;
        System.out.printf("you got %.1f%% correct.%n", accuracy);
        scanner.close();
    }

    private static void checkAnswer(Counter rightCounter, Scanner scanner, Random random) {
        int a = random.nextInt(10);
        int b = random.nextInt(10);
        System.out.printf("%d + %d = ? ", a, b);
        int userAnswer = scanner.nextInt();

        if (userAnswer == a + b) {
            System.out.println("答对啦!");
            rightCounter.increment(); // 直接修改计数器里的数值
        } else {
            System.out.println("答错了,正确答案是" + (a + b));
        }
    }
}

额外提醒

别再用Double来计数啦!答对题数是整数,用int类型更合适,既节省内存又避免不必要的包装类型问题。

内容的提问来源于stack exchange,提问作者Larson Carter

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:04:44