首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

Oracle 數值溢出錯誤解決:ROUND 函數控制精度

     編輯:Oracle 資料庫相關知識

錯誤現象

將 Oracle `NUMBER` 高精度數值轉換為程式語言 (C#/Java) 基本類型時,拋出 溢出/精度遺失 錯誤。Oracle `NUMBER` 最高支援 38 位精度,遠超 `decimal`/`double` 範圍。

根因

  • 聚合函數 (`AVG`、`SUM`、`STDDEV`) 產生大量小數位
  • 除法運算產生無限循環小數
  • 驅動程式嘗試映射到固定精度類型時截斷失敗

解決方案:ROUND 控制輸出精度

-- 保留 5 位小數,四捨五入
SELECT MIN(pval), MAX(pval), ROUND(AVG(pval), 5) FROM hvm_data_dga;

-- 除法精度控制
SELECT ROUND(32/14, 3) FROM dual;  -- 2.286
SELECT ROUND(32/14, 2) FROM dual;  -- 2.29

進階:TRUNC 直接截斷 (不四捨五入)

SELECT TRUNC(AVG(pval), 5) FROM hvm_data_dga;

最佳實踐

  1. 資料庫層面:所有對外輸出的數值欄位,在 View 或 SELECT 中統一 `ROUND(col, n)`。
  2. 應用層面:使用 `BigDecimal` (Java) / `decimal` (C#) 接收,並指定 `scale` 與 `RoundingMode`。
  3. 建立函數索引:若常用 `ROUND(col,2)` 查詢,建立 `CREATE INDEX idx_round_col ON t (ROUND(col,2))`。

相關函數速查

函數行為範例結果
ROUND(n, p)四捨五入保留 p 位小數ROUND(1.2345, 2)1.23
TRUNC(n, p)直接截斷保留 p 位TRUNC(1.2345, 2)1.23
CEIL(n)向上取整CEIL(1.01)2
FLOOR(n)向下取整FLOOR(1.99)1
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved