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
相关产品推荐
相关产品推荐

