首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

.NET 業務平台數值精度陷阱與解決方案

     編輯:關於.NET

實施人員反映數量小數位保留 3 位不足,需 6 位。回顧 ERP 系統上線以來,數量、金額、成本計算規則反覆修改多次,早期未封裝業務規則、未統一精度標準,導致修改極其繁瑣。深刻體會業務細節對系統運行至關重要,清晰的業務規則與良好架構是保障。

三大精度遺失來源

1. 計算過程精度遺失

  • 程式碼使用 float/double 導致二進制浮點誤差 → 全部改用 decimal。
  • 中間變量截斷小數位 → 中間變量保留最大精度,或直接用原始變量計算最終結果。
  • JavaScript 計算無 decimal 型別 → 最後用 toFixed() 保留精度。

2. 儲存精度遺失

  • 資料庫欄位型別錯誤(float/double) → 改用 numeric。
  • 中間儲存小數位不足 → 重新計算時精度不夠。現規範:數量 6 位、顯示金額 2 位、成本計算 8 位。

3. 顯示多餘零

報表/擁擠介面需去除尾端多餘零。Crystal Reports 方案:

if Right(ToText({命令_4.PartNum}, 6), 6) = "000000" then 0 else
if Right(ToText({命令_4.PartNum}, 6), 5) = "00000" then 1 else
if Right(ToText({命令_4.PartNum}, 6), 4) = "0000" then 2 else
if Right(ToText({命令_4.PartNum}, 6), 3) = "000" then 3 else
if Right(ToText({命令_4.PartNum}, 6), 2) = "00" then 4 else
if Right(ToText({命令_4.PartNum}, 6), 1) = "0" then 5 else 6

設定步驟截圖:

SQL 方案去除尾端零:

SELECT col,
  CASE
    WHEN CHARINDEX('.', col) = 0 THEN col
    WHEN RIGHT(col, PATINDEX('%[^0]%', REVERSE(col))) LIKE '.%'
      THEN LEFT(col, LEN(col) - PATINDEX('%[^0]%', REVERSE(col)))
    ELSE LEFT(col, LEN(col) - PATINDEX('%[^0]%', REVERSE(col)) + 1)
  END AS col_convert
FROM (VALUES ('100'), (NULL), ('.100'), ('.100100'), ('0.'), ('0'), ('100.1010'), ('100.0000')) A(col)

可封裝為函數重用。

三大注意事項

  1. 計算公式/邏輯不清導致錯誤 → ERP 開發必須深入理解業務邏輯。
  2. 後台去除零技巧:double.Parse() 再 ToString(),但連續 5 位零會變科學記號 → 先 double.Parse() 轉字串再轉 decimal 可去除多餘零。
  3. 精度規劃應盡早:原規劃數量 3 位、金額 2 位、成本 4 位,實際不足 → 應早期與客戶、架構師、開發、測試溝通,可用 Excel 等工具驗證。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved