|
@@ -1,5 +1,7 @@
|
|
|
package cn.com.qmth.stmms.biz.report.utils.unit;
|
|
|
|
|
|
+import cn.com.qmth.stmms.common.utils.BigDecimalUtils;
|
|
|
+
|
|
|
public class BaseCalculatorUnit {
|
|
|
|
|
|
public int count;
|
|
@@ -73,39 +75,47 @@ public class BaseCalculatorUnit {
|
|
|
if (excellentScore != null && score >= excellentScore) {
|
|
|
excellentCount++;
|
|
|
}
|
|
|
- sumScore += score;
|
|
|
- sumScore2 += (score * score);
|
|
|
- aggScore += (score * totalScore);
|
|
|
- sumTotalScore += totalScore;
|
|
|
- sumTotalScore2 += (totalScore * totalScore);
|
|
|
+ sumScore = BigDecimalUtils.add(score, sumScore);
|
|
|
+ sumScore2 = BigDecimalUtils.add(sumScore2, BigDecimalUtils.mul(score, score));
|
|
|
+ aggScore = BigDecimalUtils.add(aggScore, BigDecimalUtils.mul(score, totalScore));
|
|
|
+ sumTotalScore = BigDecimalUtils.add(sumTotalScore, totalScore);
|
|
|
+ sumTotalScore2 = BigDecimalUtils.add(sumTotalScore2, BigDecimalUtils.mul(totalScore, totalScore));
|
|
|
maxScore = Math.max(maxScore, score);
|
|
|
minScore = Math.min(minScore, score);
|
|
|
- avgScore = sumScore / count;
|
|
|
+ avgScore = BigDecimalUtils.div(sumScore, count);
|
|
|
// 递归法计算标准差
|
|
|
- stdev = Math.sqrt(sumScore2 / count - Math.pow(sumScore / count, 2));
|
|
|
+ stdev = Math.sqrt(BigDecimalUtils.sub(BigDecimalUtils.div(sumScore2, count),
|
|
|
+ BigDecimalUtils.mul(avgScore, avgScore)));
|
|
|
+ if (stdev == Double.NaN) {
|
|
|
+ stdev = 0;
|
|
|
+ }
|
|
|
// 难度
|
|
|
- difficulty = fullScore > 0 ? avgScore / fullScore : 0;
|
|
|
+ difficulty = fullScore > 0 ? BigDecimalUtils.div(avgScore, fullScore) : 0;
|
|
|
// 差异系数
|
|
|
- coefficient = avgScore > 0 ? stdev * 100 / avgScore : 0;
|
|
|
+ coefficient = avgScore > 0 ? BigDecimalUtils.div(stdev * 100, avgScore) : 0;
|
|
|
// 区分度
|
|
|
- double temp = Math.sqrt((sumScore2 - sumScore * sumScore / count) * (sumTotalScore2 - sumTotalScore * sumTotalScore / count));
|
|
|
+ double temp = Math.sqrt((sumScore2 - sumScore * sumScore / count)
|
|
|
+ * (sumTotalScore2 - sumTotalScore * sumTotalScore / count));
|
|
|
if (temp != 0 && Double.NaN != temp) {
|
|
|
discrimination = (aggScore - sumScore * sumTotalScore / count) / temp;
|
|
|
} else {
|
|
|
discrimination = 0;
|
|
|
}
|
|
|
+ if (Double.NaN == discrimination) {
|
|
|
+ discrimination = 0;
|
|
|
+ }
|
|
|
// 及格率
|
|
|
- passRate = passCount * 1.0 / count;
|
|
|
+ passRate = BigDecimalUtils.div(passCount, count);
|
|
|
// 优秀率
|
|
|
- excellentRate = excellentCount * 1.0 / count;
|
|
|
+ excellentRate = BigDecimalUtils.div(excellentCount, count);
|
|
|
// 满分率
|
|
|
- fullScoreRate = fullCount * 1.0 / count;
|
|
|
+ fullScoreRate = BigDecimalUtils.div(fullCount, count);
|
|
|
}
|
|
|
|
|
|
@Override
|
|
|
public String toString() {
|
|
|
- return "count=" + count + ",zeroCount=" + zeroCount + ",fullCount=" + fullCount + ",fullScore=" + fullScore + ",maxScore="
|
|
|
- + maxScore + ",minScore=" + minScore + ",avgScore=" + avgScore + ",stdev=" + stdev + ",difficulty=" + difficulty
|
|
|
- + ",coefficient=" + coefficient + ",discrimination=" + discrimination;
|
|
|
+ return "count=" + count + ",zeroCount=" + zeroCount + ",fullCount=" + fullCount + ",fullScore=" + fullScore
|
|
|
+ + ",maxScore=" + maxScore + ",minScore=" + minScore + ",avgScore=" + avgScore + ",stdev=" + stdev
|
|
|
+ + ",difficulty=" + difficulty + ",coefficient=" + coefficient + ",discrimination=" + discrimination;
|
|
|
}
|
|
|
}
|