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

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));
}
// 修改使用double进行精确计算只在最后保留小数
protected double calculateExpression(double[] values, int[] operations) {
List<Double> numbers = new ArrayList<>();
List<Integer> 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<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;
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) {

Loading…
Cancel
Save