修复小学题目计算精度问题:先精确计算再保留小数

liuyi_branch
柳意 2 months ago
parent 763eaa0e23
commit 46e201e002

@ -36,6 +36,7 @@ public abstract class BaseQuestionGenerator {
return !(answer < 0 || Double.isNaN(answer) || Double.isInfinite(answer)); return !(answer < 0 || Double.isNaN(answer) || Double.isInfinite(answer));
} }
// 修改使用double进行精确计算只在最后保留小数
protected double calculateExpression(double[] values, int[] operations) { protected double calculateExpression(double[] values, int[] operations) {
List<Double> numbers = new ArrayList<>(); List<Double> numbers = new ArrayList<>();
List<Integer> ops = new ArrayList<>(); List<Integer> ops = new ArrayList<>();
@ -94,6 +95,7 @@ public abstract class BaseQuestionGenerator {
result = performOperation(result, nextNum, op); result = performOperation(result, nextNum, op);
} }
// 修改只在最后一步进行四舍五入保留2位小数
return Math.round(result * 100) / 100.0; return Math.round(result * 100) / 100.0;
} }
@ -104,6 +106,7 @@ public abstract class BaseQuestionGenerator {
case 2: return left * right; case 2: return left * right;
case 3: case 3:
if (right == 0) return Double.NaN; if (right == 0) return Double.NaN;
// 修改:直接进行除法,不在这里保留小数
return left / right; return left / right;
default: return left; default: return left;
} }
@ -113,8 +116,9 @@ public abstract class BaseQuestionGenerator {
String[] options = new String[4]; String[] options = new String[4];
Set<String> usedValues = new HashSet<>(); Set<String> 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; options[0] = correctAnswer;
usedValues.add(correctAnswer); usedValues.add(correctAnswer);
@ -134,7 +138,8 @@ public abstract class BaseQuestionGenerator {
do { do {
double wrongValue = generateWrongValue(answer, isIntegerAnswer); double wrongValue = generateWrongValue(answer, isIntegerAnswer);
wrongAnswer = formatAnswer(wrongValue); wrongAnswer = formatAnswer(wrongValue,
Math.abs(wrongValue - Math.round(wrongValue)) < 1e-10);
attempts++; attempts++;
} while (usedValues.contains(wrongAnswer) && attempts < 20); } while (usedValues.contains(wrongAnswer) && attempts < 20);
@ -147,20 +152,26 @@ public abstract class BaseQuestionGenerator {
double offset = (random.nextDouble() * 5) + 1; double offset = (random.nextDouble() * 5) + 1;
if (isIntegerAnswer) { if (isIntegerAnswer) {
int intAnswer = (int) answer; int intAnswer = (int) Math.round(answer);
int intOffset = random.nextInt(10) + 1; int intOffset = random.nextInt(10) + 1;
double wrongValue = random.nextBoolean() ? double wrongValue = random.nextBoolean() ?
intAnswer + intOffset : Math.max(1, intAnswer - intOffset); intAnswer + intOffset : Math.max(1, intAnswer - intOffset);
return (int) wrongValue; return wrongValue;
} else { } else {
double wrongValue = random.nextBoolean() ? answer + offset : answer - offset; double wrongValue = random.nextBoolean() ? answer + offset : answer - offset;
// 修改错误选项也保留2位小数
return Math.round(wrongValue * 100) / 100.0; return Math.round(wrongValue * 100) / 100.0;
} }
} }
private String formatAnswer(double answer) { // 修改:格式化答案,只在最后一步处理小数位数
return (answer == (int) answer) ? private String formatAnswer(double answer, boolean isInteger) {
String.valueOf((int) answer) : String.format("%.2f", answer); if (isInteger) {
return String.valueOf((int) Math.round(answer));
} else {
// 确保显示2位小数即使末尾是0
return String.format("%.2f", answer);
}
} }
private void shuffleArray(String[] array) { private void shuffleArray(String[] array) {

Loading…
Cancel
Save