From 46e201e0026110df5125feead89fd6b9b453c8a3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9F=B3=E6=84=8F?= <1449892469@qq.com> Date: Sun, 12 Oct 2025 09:47:04 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=B0=8F=E5=AD=A6=E9=A2=98?= =?UTF-8?q?=E7=9B=AE=E8=AE=A1=E7=AE=97=E7=B2=BE=E5=BA=A6=E9=97=AE=E9=A2=98?= =?UTF-8?q?=EF=BC=9A=E5=85=88=E7=B2=BE=E7=A1=AE=E8=AE=A1=E7=AE=97=E5=86=8D?= =?UTF-8?q?=E4=BF=9D=E7=95=99=E5=B0=8F=E6=95=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../model/BaseQuestionGenerator.java | 27 +++++++++++++------ 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/src/com/mathlearning/model/BaseQuestionGenerator.java b/src/com/mathlearning/model/BaseQuestionGenerator.java index 88cec22..2a82651 100644 --- a/src/com/mathlearning/model/BaseQuestionGenerator.java +++ b/src/com/mathlearning/model/BaseQuestionGenerator.java @@ -36,6 +36,7 @@ public abstract class BaseQuestionGenerator { return !(answer < 0 || Double.isNaN(answer) || Double.isInfinite(answer)); } + // 修改:使用double进行精确计算,只在最后保留小数 protected double calculateExpression(double[] values, int[] operations) { List numbers = new ArrayList<>(); List ops = new ArrayList<>(); @@ -94,6 +95,7 @@ public abstract class BaseQuestionGenerator { result = performOperation(result, nextNum, op); } + // 修改:只在最后一步进行四舍五入保留2位小数 return Math.round(result * 100) / 100.0; } @@ -104,6 +106,7 @@ public abstract class BaseQuestionGenerator { case 2: return left * right; case 3: if (right == 0) return Double.NaN; + // 修改:直接进行除法,不在这里保留小数 return left / right; default: return left; } @@ -113,8 +116,9 @@ public abstract class BaseQuestionGenerator { String[] options = new String[4]; Set usedValues = new HashSet<>(); - boolean isIntegerAnswer = (answer == (int) answer); - String correctAnswer = formatAnswer(answer); + // 修改:判断是否为整数的逻辑 + boolean isIntegerAnswer = Math.abs(answer - Math.round(answer)) < 1e-10; + String correctAnswer = formatAnswer(answer, isIntegerAnswer); options[0] = correctAnswer; usedValues.add(correctAnswer); @@ -134,7 +138,8 @@ public abstract class BaseQuestionGenerator { do { double wrongValue = generateWrongValue(answer, isIntegerAnswer); - wrongAnswer = formatAnswer(wrongValue); + wrongAnswer = formatAnswer(wrongValue, + Math.abs(wrongValue - Math.round(wrongValue)) < 1e-10); attempts++; } while (usedValues.contains(wrongAnswer) && attempts < 20); @@ -147,20 +152,26 @@ public abstract class BaseQuestionGenerator { double offset = (random.nextDouble() * 5) + 1; if (isIntegerAnswer) { - int intAnswer = (int) answer; + int intAnswer = (int) Math.round(answer); int intOffset = random.nextInt(10) + 1; double wrongValue = random.nextBoolean() ? intAnswer + intOffset : Math.max(1, intAnswer - intOffset); - return (int) wrongValue; + return wrongValue; } else { double wrongValue = random.nextBoolean() ? answer + offset : answer - offset; + // 修改:错误选项也保留2位小数 return Math.round(wrongValue * 100) / 100.0; } } - private String formatAnswer(double answer) { - return (answer == (int) answer) ? - String.valueOf((int) answer) : String.format("%.2f", answer); + // 修改:格式化答案,只在最后一步处理小数位数 + private String formatAnswer(double answer, boolean isInteger) { + if (isInteger) { + return String.valueOf((int) Math.round(answer)); + } else { + // 确保显示2位小数,即使末尾是0 + return String.format("%.2f", answer); + } } private void shuffleArray(String[] array) {