From eeeba7b68574b11db7f752dc53f225ca1b0d39c8 Mon Sep 17 00:00:00 2001 From: Your Name Date: Thu, 15 Jan 2026 15:47:59 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E7=A7=AF=E5=88=86?= =?UTF-8?q?=E6=98=BE=E7=A4=BA=E7=9A=84=E6=B5=AE=E7=82=B9=E6=95=B0=E7=B2=BE?= =?UTF-8?q?=E5=BA=A6=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 使用 Math.round(score * 100) / 100 避免 JavaScript 浮点数计算误差 例如 0.1 × 46 现在正确显示为 4.60 而不是 4.600000000000005 --- frontend/src/views/Achievements.vue | 5 +++-- frontend/src/views/Analytics.vue | 5 +++-- frontend/src/views/CheckIn.vue | 5 +++-- frontend/src/views/Contests.vue | 5 +++-- frontend/src/views/CreateTask.vue | 5 +++-- frontend/src/views/DesignerHall.vue | 5 +++-- frontend/src/views/Goals.vue | 5 +++-- frontend/src/views/IncentiveCenter.vue | 5 +++-- frontend/src/views/LeaderWorkbench.vue | 5 +++-- frontend/src/views/MyTasks.vue | 5 +++-- frontend/src/views/RewardRecords.vue | 5 +++-- frontend/src/views/TaskHall.vue | 5 +++-- frontend/src/views/admin/ScorePoolManagement.vue | 5 +++-- 13 files changed, 39 insertions(+), 26 deletions(-) diff --git a/frontend/src/views/Achievements.vue b/frontend/src/views/Achievements.vue index 1e51d89..5fcc53e 100644 --- a/frontend/src/views/Achievements.vue +++ b/frontend/src/views/Achievements.vue @@ -162,10 +162,11 @@ const filteredAchievements = computed(() => { return result }) -// 格式化积分(保留两位小数) +// 格式化积分(保留两位小数,修复浮点数精度问题) const formatScore = (score: number | null | undefined): string => { if (score === null || score === undefined) return '0.00' - return Number(score).toFixed(2) + // 先乘以100,四舍五入取整,再除以100,避免浮点数精度问题 + return (Math.round(Number(score) * 100) / 100).toFixed(2) } // 加载所有成就 diff --git a/frontend/src/views/Analytics.vue b/frontend/src/views/Analytics.vue index 6282222..e3950f6 100644 --- a/frontend/src/views/Analytics.vue +++ b/frontend/src/views/Analytics.vue @@ -1148,10 +1148,11 @@ const formatDateOnly = (date: string | undefined) => { return dayjs(date).format('YYYY-MM-DD') } -// 格式化积分(保留两位小数) +// 格式化积分(保留两位小数,修复浮点数精度问题) const formatScore = (score: number | null | undefined): string => { if (score === null || score === undefined) return '0.00' - return Number(score).toFixed(2) + // 先乘以100,四舍五入取整,再除以100,避免浮点数精度问题 + return (Math.round(Number(score) * 100) / 100).toFixed(2) } // 单独加载设计师绩效数据(用于部门筛选) diff --git a/frontend/src/views/CheckIn.vue b/frontend/src/views/CheckIn.vue index e69fc50..b5e6c6b 100644 --- a/frontend/src/views/CheckIn.vue +++ b/frontend/src/views/CheckIn.vue @@ -264,10 +264,11 @@ const calculateReward = (continuousDays: number): number => { } } -// 格式化积分(保留两位小数) +// 格式化积分(保留两位小数,修复浮点数精度问题) const formatScore = (score: number | null | undefined): string => { if (score === null || score === undefined) return '0.00' - return Number(score).toFixed(2) + // 先乘以100,四舍五入取整,再除以100,避免浮点数精度问题 + return (Math.round(Number(score) * 100) / 100).toFixed(2) } // 格式化日期 diff --git a/frontend/src/views/Contests.vue b/frontend/src/views/Contests.vue index 0de02d2..68b8f77 100644 --- a/frontend/src/views/Contests.vue +++ b/frontend/src/views/Contests.vue @@ -290,10 +290,11 @@ const contestForm = ref({ endTime: null as Dayjs | null }) -// 格式化积分(保留两位小数) +// 格式化积分(保留两位小数,修复浮点数精度问题) const formatScore = (score: number | null | undefined): string => { if (score === null || score === undefined) return '0.00' - return Number(score).toFixed(2) + // 先乘以100,四舍五入取整,再除以100,避免浮点数精度问题 + return (Math.round(Number(score) * 100) / 100).toFixed(2) } const loadData = async () => { diff --git a/frontend/src/views/CreateTask.vue b/frontend/src/views/CreateTask.vue index fb45e92..390dfac 100644 --- a/frontend/src/views/CreateTask.vue +++ b/frontend/src/views/CreateTask.vue @@ -971,10 +971,11 @@ watch( } ) -// 格式化积分(保留两位小数) +// 格式化积分(保留两位小数,修复浮点数精度问题) const formatScore = (score: number | null | undefined): string => { if (score === null || score === undefined) return '0.00' - return Number(score).toFixed(2) + // 先乘以100,四舍五入取整,再除以100,避免浮点数精度问题 + return (Math.round(Number(score) * 100) / 100).toFixed(2) } // 计算预估积分(累加所有任务类型) diff --git a/frontend/src/views/DesignerHall.vue b/frontend/src/views/DesignerHall.vue index f4dc24d..0a63e0b 100644 --- a/frontend/src/views/DesignerHall.vue +++ b/frontend/src/views/DesignerHall.vue @@ -356,10 +356,11 @@ const formatDate = (date: string | null | undefined) => { return dayjs(date).format('MM/DD HH:mm') } -// 格式化积分(保留两位小数) +// 格式化积分(保留两位小数,修复浮点数精度问题) const formatScore = (score: number | null | undefined): string => { if (score === null || score === undefined) return '0.00' - return Number(score).toFixed(2) + // 先乘以100,四舍五入取整,再除以100,避免浮点数精度问题 + return (Math.round(Number(score) * 100) / 100).toFixed(2) } // 获取进度条颜色 diff --git a/frontend/src/views/Goals.vue b/frontend/src/views/Goals.vue index ec1e288..5be507c 100644 --- a/frontend/src/views/Goals.vue +++ b/frontend/src/views/Goals.vue @@ -262,10 +262,11 @@ const goalForm = ref({ rewardScore: 50 }) -// 格式化积分(保留两位小数) +// 格式化积分(保留两位小数,修复浮点数精度问题) const formatScore = (score: number | null | undefined): string => { if (score === null || score === undefined) return '0.00' - return Number(score).toFixed(2) + // 先乘以100,四舍五入取整,再除以100,避免浮点数精度问题 + return (Math.round(Number(score) * 100) / 100).toFixed(2) } const loadData = async () => { diff --git a/frontend/src/views/IncentiveCenter.vue b/frontend/src/views/IncentiveCenter.vue index ffd0111..e0f6903 100644 --- a/frontend/src/views/IncentiveCenter.vue +++ b/frontend/src/views/IncentiveCenter.vue @@ -252,10 +252,11 @@ import { const router = useRouter() const authStore = useAuthStore() -// 格式化积分(保留两位小数) +// 格式化积分(保留两位小数,修复浮点数精度问题) const formatScore = (score: number | null | undefined): string => { if (score === null || score === undefined) return '0.00' - return Number(score).toFixed(2) + // 先乘以100,四舍五入取整,再除以100,避免浮点数精度问题 + return (Math.round(Number(score) * 100) / 100).toFixed(2) } // 用户数据 diff --git a/frontend/src/views/LeaderWorkbench.vue b/frontend/src/views/LeaderWorkbench.vue index 921f8d0..bb4e897 100644 --- a/frontend/src/views/LeaderWorkbench.vue +++ b/frontend/src/views/LeaderWorkbench.vue @@ -257,10 +257,11 @@ const formatTime = (time: string | undefined) => { return dayjs(time).format('YYYY-MM-DD HH:mm') } -// 格式化积分(保留两位小数) +// 格式化积分(保留两位小数,修复浮点数精度问题) const formatScore = (score: number | null | undefined): string => { if (score === null || score === undefined) return '0.00' - return Number(score).toFixed(2) + // 先乘以100,四舍五入取整,再除以100,避免浮点数精度问题 + return (Math.round(Number(score) * 100) / 100).toFixed(2) } // 判断是否逾期 diff --git a/frontend/src/views/MyTasks.vue b/frontend/src/views/MyTasks.vue index 3894d49..defb7da 100644 --- a/frontend/src/views/MyTasks.vue +++ b/frontend/src/views/MyTasks.vue @@ -581,10 +581,11 @@ const formatTime = (time: string | undefined) => { return dayjs(time).format('YYYY-MM-DD HH:mm') } -// 格式化积分(保留两位小数) +// 格式化积分(保留两位小数,修复浮点数精度问题) const formatScore = (score: number | null | undefined): string => { if (score === null || score === undefined) return '0.00' - return Number(score).toFixed(2) + // 先乘以100,四舍五入取整,再除以100,避免浮点数精度问题 + return (Math.round(Number(score) * 100) / 100).toFixed(2) } // 判断是否逾期 diff --git a/frontend/src/views/RewardRecords.vue b/frontend/src/views/RewardRecords.vue index 24738cb..1cb2e2e 100644 --- a/frontend/src/views/RewardRecords.vue +++ b/frontend/src/views/RewardRecords.vue @@ -101,10 +101,11 @@ const totalScore = computed(() => { return formatScore(total) }) -// 格式化积分(保留两位小数) +// 格式化积分(保留两位小数,修复浮点数精度问题) const formatScore = (score: number | null | undefined): string => { if (score === null || score === undefined) return '0.00' - return Number(score).toFixed(2) + // 先乘以100,四舍五入取整,再除以100,避免浮点数精度问题 + return (Math.round(Number(score) * 100) / 100).toFixed(2) } const totalCount = computed(() => total.value) diff --git a/frontend/src/views/TaskHall.vue b/frontend/src/views/TaskHall.vue index 463db04..4871a74 100644 --- a/frontend/src/views/TaskHall.vue +++ b/frontend/src/views/TaskHall.vue @@ -2891,10 +2891,11 @@ const formatDate = (date: string | undefined) => { return dayjs(date).format('YYYY-MM-DD') } -// 格式化积分(保留两位小数) +// 格式化积分(保留两位小数,修复浮点数精度问题) const formatScore = (score: number | null | undefined): string => { if (score === null || score === undefined) return '0.00' - return Number(score).toFixed(2) + // 先乘以100,四舍五入取整,再除以100,避免浮点数精度问题 + return (Math.round(Number(score) * 100) / 100).toFixed(2) } // 格式化截止时间 diff --git a/frontend/src/views/admin/ScorePoolManagement.vue b/frontend/src/views/admin/ScorePoolManagement.vue index 25061bc..a73198d 100644 --- a/frontend/src/views/admin/ScorePoolManagement.vue +++ b/frontend/src/views/admin/ScorePoolManagement.vue @@ -419,10 +419,11 @@ const recordPagination = ref({ total: 0 }) -// 格式化积分(保留两位小数) +// 格式化积分(保留两位小数,修复浮点数精度问题) const formatScore = (score: number | null | undefined): string => { if (score === null || score === undefined) return '0.00' - return Number(score).toFixed(2) + // 先乘以100,四舍五入取整,再除以100,避免浮点数精度问题 + return (Math.round(Number(score) * 100) / 100).toFixed(2) } const loadData = async () => {