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