Procházet zdrojové kódy

浮点精度问题

Michael Wang před 4 roky
rodič
revize
703293d095

+ 40 - 1
src/api/markPage.ts

@@ -24,7 +24,46 @@ export async function getGroup() {
 
 /** 获取评卷任务 */
 export async function getTask() {
-  return httpApp.post("/mark/getTask");
+  const res = await httpApp.post("/mark/getTask");
+  // if (res.data.questionList) {
+  //   const task = res.data as Task;
+  //   if (!isNull(task.objectiveScore)) {
+  //     task.objectiveScore = Math.round(task.objectiveScore * 100);
+  //   }
+  //   if (!isNull(task.markerScore)) {
+  //     task.markerScore = Math.round(task.markerScore * 100);
+  //   }
+  //   if (task.questionList.length > 0) {
+  //     task.questionList = task.questionList.map((q) => {
+  //       if (!isNull(q.intervalScore)) {
+  //         q.intervalScore = Math.round(q.intervalScore * 100);
+  //       }
+  //       if (!isNull(q.defaultScore)) {
+  //         q.defaultScore = Math.round(q.defaultScore * 100);
+  //       }
+  //       if (!isNull(q.minScore)) {
+  //         q.minScore = Math.round(q.minScore * 100);
+  //       }
+  //       if (!isNull(q.maxScore)) {
+  //         q.maxScore = Math.round(q.maxScore * 100);
+  //       }
+  //       if (!isNull(q.score)) {
+  //         q.score = Math.round(q.score * 100);
+  //       }
+  //       if (q.trackList?.length > 0) {
+  //         q.trackList = q.trackList.map((t) => {
+  //           if (!isNull(t.score)) {
+  //             t.score = Math.round(t.score * 100);
+  //           }
+  //           return t;
+  //         });
+  //       }
+
+  //       return q;
+  //     });
+  //   }
+  // }
+  return res;
 }
 
 /** 更新评卷UI */

+ 1 - 1
src/features/inspect/MarkBoardInspect.vue

@@ -108,7 +108,7 @@ export default defineComponent({
     const markerScore = computed(
       () =>
         (questions.value
-          ?.map((q) => (q.score || 0) * 100)
+          ?.map((q) => Math.round((q.score || 0) * 100))
           .reduce((acc, s) => acc + s) || 0) / 100
     );
 

+ 7 - 3
src/features/mark/MarkBoardTrack.vue

@@ -92,16 +92,20 @@ export default defineComponent({
       if (!question) return [];
 
       const remainScore =
-        (question.maxScore * 100 - (question.score || 0) * 100) / 100;
+        Math.round(question.maxScore * 100 - (question.score || 0) * 100) / 100;
       const steps = [];
       for (
         let i = 0;
         i <= remainScore;
-        i = (i * 10 + question.intervalScore * 10) / 10
+        i = Math.round(i * 100 + question.intervalScore * 100) / 100
       ) {
         steps.push(i);
       }
-      if ((remainScore * 10) % (question.intervalScore * 10) !== 0) {
+      if (
+        Math.round(remainScore * 100) %
+          Math.round(question.intervalScore * 100) !==
+        0
+      ) {
         steps.push(remainScore);
       }
 

+ 5 - 4
src/features/mark/MarkBody.vue

@@ -396,8 +396,9 @@ export default defineComponent({
           const questionWithScore = Object.entries(scoreGroups);
           const questionWithTotalScore = questionWithScore.map((v) => [
             v[0],
-            v[1].map((s) => s.score * 100).reduce((acc, c) => (acc += c), 0) /
-              100,
+            v[1]
+              .map((s) => Math.round(s.score * 100))
+              .reduce((acc, c) => (acc += c), 0) / 100,
           ]);
           const questionWithTotalScoreSorted = sortBy(
             questionWithTotalScore,
@@ -421,7 +422,7 @@ export default defineComponent({
                     v.subNumber === cq.subNumber
                 )
                 .map((v) => v.score)
-                .reduce((acc, v) => (acc += v * 100), 0) / 100;
+                .reduce((acc, v) => (acc += Math.round(v * 100)), 0) / 100;
           }
           markResult.scoreList = scoreList as number[];
           // const sortScore = orderBy(markResult.trackList, ['mainNumber', 'subNumber', 'score']);
@@ -433,7 +434,7 @@ export default defineComponent({
           markResult.markerScore =
             markResult.scoreList
               .filter((v): v is number => v !== null)
-              .reduce((acc, v) => (acc += v * 100), 0) / 100;
+              .reduce((acc, v) => (acc += Math.round(v * 100)), 0) / 100;
 
           // console.log(markResult.scoreList, markResult.markerScore);
           // renderPaperAndMark();

+ 1 - 1
src/features/mark/store.ts

@@ -69,7 +69,7 @@ export function findCurrentTaskMarkResult() {
     markResult.markerScore =
       markResult.scoreList
         .filter((v): v is number => v !== null)
-        .reduce((acc, v) => (acc += v * 100), 0) / 100;
+        .reduce((acc, v) => (acc += Math.round(v * 100)), 0) / 100;
     store.markResults = [...store.markResults, markResult];
   }
 

+ 1 - 1
src/features/mark/use/keyboardAndMouse.ts

@@ -24,7 +24,7 @@ export function keyMouse() {
           );
           markResult.scoreList = scoreList as number[];
           markResult.markerScore =
-            scoreList.reduce((acc, v) => (acc += v * 100), 0) / 100;
+            scoreList.reduce((acc, v) => (acc += Math.round(v * 100)), 0) / 100;
         }
       }
     }