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) {