MySQL--MySQL中的DECIMAL 與 Java中的BigDecimal

1. 為什么需要 DECIMAL

在數據庫中,常見的數值類型有:

  • INTBIGINT → 整數,存儲容量有限。

  • FLOATDOUBLE → 浮點數,存儲效率高,但存在精度丟失問題

  • DECIMAL(M, D) → 定點數,存儲精確值

例子:

SELECT 0.1 + 0.2;   -- 結果可能是 0.30000000000000004

這是浮點數的經典精度問題。
如果用 DECIMAL(10,2) 存儲:

INSERT INTO test (amount) VALUES (0.1), (0.2);
SELECT SUM(amount);  -- 結果就是 0.30 (精確)

👉 結論:金融、電商、會計等涉及金額的業務必須使用 DECIMAL,而不能用 FLOAT / DOUBLE


2. DECIMAL 的存儲方式

  • DECIMAL(M, D) 表示總共 M 位數字,其中 D 位小數

    • M 最大 65(總位數)

    • D 最大 30(小數位數)

  • 存儲為字符串形式的二進制編碼,避免二進制浮點數誤差。

  • 計算時精度高,但性能略低于 FLOAT / DOUBLE

例子:

DECIMAL(10,2)  -- 最大值:99999999.99
DECIMAL(18,6)  -- 最大值:999999999999.999999

3. MySQL 中 DECIMAL 與 Java 的對應關系

在 Java 中,浮點數(floatdouble)也有精度問題,典型例子:

System.out.println(0.1 + 0.2);  // 輸出 0.30000000000000004

Java 中對應的精確數值類型是 BigDecimal

類型映射

MySQL 類型Java JDBC 映射類型
DECIMAL / NUMERICjava.math.BigDecimal
FLOAT / DOUBLEDouble / Float
INT / BIGINTInteger / Long

4. Java BigDecimal 使用注意事項

(1) 創建方式

BigDecimal a = new BigDecimal("0.1");   // 推薦,精確
BigDecimal b = new BigDecimal("0.2");
System.out.println(a.add(b));  // 0.3// 不推薦
BigDecimal c = new BigDecimal(0.1); // 會有精度問題
System.out.println(c);  // 0.10000000000000000555...

(2) 常見操作

BigDecimal x = new BigDecimal("10.25");
BigDecimal y = new BigDecimal("2.5");System.out.println(x.add(y));      // 加法
System.out.println(x.subtract(y)); // 減法
System.out.println(x.multiply(y)); // 乘法
System.out.println(x.divide(y, 2, RoundingMode.HALF_UP)); // 除法,保留2位四舍五入

(3) 比較大小

不能用 equals,需要用 compareTo

BigDecimal a = new BigDecimal("1.0");
BigDecimal b = new BigDecimal("1.00");System.out.println(a.equals(b));      // false(因為精度不同)
System.out.println(a.compareTo(b));   // 0(數值相等)

5. 典型應用場景

  1. 金額字段

    price DECIMAL(10,2)  -- 最大 99999999.99
    

    Java 中用 BigDecimal 接收,避免丟失精度。

  2. 財務統計

    • 統計總金額 → 必須保證無誤差

    • 結算、報表 → 精確小數位

  3. 電商優惠計算

    • 折扣、積分兌換、滿減 → 都需要 BigDecimal 來精確計算。


6. 總結

  • FLOAT / DOUBLE → 高性能但有精度問題,適合科學計算、近似值場景。

  • DECIMAL → 精確存儲,適合金額和財務場景,性能稍低但可以接受。

  • 在 Java 中:

    • 金額類 → 使用 BigDecimal

    • 存入數據庫 → 使用 DECIMAL(M, D)

    • 避免直接用 double 運算金額。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/920326.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/920326.shtml
英文地址,請注明出處:http://en.pswp.cn/news/920326.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

低空無人機系統關鍵技術與應用前景:SmartMediaKit視頻鏈路的基石價值

引言:低空經濟的新興格局 低空經濟作為“新質生產力”的代表,正在從政策驅動、技術突破和市場需求的共振中走向產業化。2023年,中國低空經濟的市場規模已超過 5000 億元人民幣,同比增長超過 30%。無人機(UAV&#xff…

在Windows系統上升級Node.js和npm

在Windows系統上升級Node.js和npm,我推薦以下幾種方法: 方法1:使用官網安裝包(最簡單) 訪問 nodejs.org 下載Windows安裝包(.msi文件) 運行安裝包,選擇"修復"或直接安裝新…

【Jetson】基于llama.cpp部署gpt-oss-20b(推理與GUI交互)

前言 本文在jetson設備上使用llama.cpp完成gpt-oss 20b的部署,包括后端推理和GUI的可視化交互。 使用的設備為orin nx 16g(super),這個顯存大小推理20b的模型完全沒有問題。 使用硬件如下,支持開啟super模式。&#…

Matplotlib 可視化大師系列(一):plt.plot() - 繪制折線圖的利刃

目錄Matplotlib 可視化大師系列博客總覽Matplotlib 可視化大師系列(一):plt.plot() - 繪制折線圖的利刃一、 plt.plot() 是什么?二、 函數原型與核心參數核心參數詳解三、 從入門到精通:代碼示例示例 1:最基…

第二階段Winfrom-8:特性和反射,加密和解密,單例模式

1_預處理指令 (1)源代碼指定了程序的定義,預處理指令(preprocessor directive)指示編譯器如何處理源代碼。例如,在某些情況下,我們希望編譯器能夠忽略一部分代碼,而在其他情況下&am…

【開題答辯全過程】以 微信小程序的醫院掛號預約系統為例,包含答辯的問題和答案

個人簡介一名14年經驗的資深畢設內行人,語言擅長Java、php、微信小程序、Python、Golang、安卓Android等開發項目包括大數據、深度學習、網站、小程序、安卓、算法。平常會做一些項目定制化開發、代碼講解、答辯教學、文檔編寫、也懂一些降重方面的技巧。感謝大家的…

鴻蒙ArkUI 基礎篇-06-組件基礎語法-Column/Row/Text

目錄 掌握組件寫法,使用組件布局界面 ArkUI與組件 先布局再內容 DevEco Studio代碼實戰 預覽效果 總結 練習 掌握組件寫法,使用組件布局界面 ArkUI與組件 ArkUI(方舟開發框架):構建 鴻蒙 應用 界面 的框架 組件…

8.27 網格memo

lc329計算矩陣中最長遞增路徑長度嘗試從矩陣每個位置出發,int dfs() 往上下左右四個方向找嚴格遞增的路徑retmax(ret,dfs(x,y)1);return memo[i][j]ret;返回所有路徑里的最長長度 class Solution {public:int dx[4]{0,0,1,-1};int dy[4]{1,-1,0,0};int m,n;vector&l…

flume監控文件寫入 Kafka 實戰:解耦應用與消息隊列的最佳實踐

flume監控文件寫入 Kafka 實戰:解耦應用與消息隊列的最佳實踐 在日志采集場景中,直接讓應用程序通過 log4j2 寫入 Kafka 會導致應用與 Kafka 強耦合(如 Kafka 故障可能影響應用運行)。更優的方案是:應用程序將日志寫入…

從瀏覽器無法訪問到Docker容器的 FastAPI 服務地址【宿主機瀏覽器和容器不在同一個網絡層面:端口映射】

文章目錄1. 問題根源:Docker 網絡模型2. 解決方案:端口映射(Port Mapping)方法 1:重新運行容器并添加端口映射(推薦)方法 2:獲取宿主機的 IP 進行訪問(特定情況&#xff…

線性代數中矩陣等價與離散數學中關系的閉包之間的關聯

最近在重溫線性代數時,學到矩陣的等價的定義及其性質,發現其性質與離散數學中關系的閉包所要滿足的性質非常相似,不由的讓人不懷疑這二者之間存在某種關聯,從而引發以下的思考:從deepseek的回答中我明白了矩陣的等價其…

從MyJUnit反思Java項目的工程實踐(版本控制篇)

從 MyJUnit 反思Java項目的工程實踐(版本控制篇) 參考資料 deepseekgithub copilotCSDN-Git代碼管理工作流程:GitFlow詳解Conventional Commits手冊封面來自 qwen-image 遵循 git flow 分支管理模型 Git Flow 是一種圍繞項目發布的核心分支模型, 它規定了不同的開發…

小工具推薦

小工具 ? 平時不太喜歡去搜羅一些好用的工具,但是看到自己感興趣的還是會記下來,有的是github上的開源項目,有的是一些直接在線的工具。主要是除了工作時間也不知道去干點什么,或者是和朋友玩玩游戲,或者是city walk…

【js】加密庫sha.js 嚴重漏洞速查

前言sha.js 是 JavaScript 生態里最常用的輕量級加密庫。它由 Browserify 社區維護,體積不足 20 KB,卻實現了 SHA-1、SHA-224、SHA-256、SHA-384、SHA-512 全系列算法,是 crypto-browserify、webpack、web3.js 等數百個流行包的“根依賴”。而…

FPGA入門學習路徑

FPGA入門學習路徑 專業基礎 數電(數字電路基礎-CSDN博客) 語法 Verilog(Verilog硬件描述語言-CSDN博客) VHDL(VHDL硬件描述語言-CSDN博客) FPGA開發流程 常用接口設計 學習目的:通過簡單…

HTML響應式設計的顏色選擇器,適配各種屏幕尺寸

顏色選擇器 響應式設計的顏色選擇器,適配各種屏幕尺寸 支持色相滑塊和RGB數值兩種調色方式 點擊顏色值或復制按鈕即可復制十六進制顏色代碼 自動根據背景色調整文字顏色確保可讀性 包含復制成功提示動畫效果 現代化UI設計,采用圓角、陰影和漸變背景 完全…

ChatGPT登錄不進怎么辦?

ChatGPT登錄不進的核心原因分類ChatGPT登錄失敗并非單一問題導致,通常與網絡環境、賬號狀態、設備設置及平臺限制相關,不同場景下的故障表現與誘因存在明顯差異,可分為以下四類:網絡連接與地域限制:ChatGPT對訪問地域有…

【ConcurrentHashMap】實現原理和HashMap、Redis哈希的區別

【ConcurrentHashMap】實現原理和HashMap、Redis哈希的區別【一】核心思想【1】HashMap?(1)概括(2)🚀線程不安全的場景和原因1-場景一:Put 操作導致的數據覆蓋/丟失 (Lost Update)??2-場景二&#xff1a…

Android 中使用開源庫 ZXing 生成二維碼圖片

在 Android 中生成二維碼是一個比較常見的功能,可以使用開源庫 ZXing(Zebra Crossing)庫來實現,這是一個非常流行的二維碼生成和掃描庫。 1、添加依賴庫 在 app/build.gradle.kt 中添加依賴庫。 dependencies { ......implementat…

vue 如何使用 vxe-table 來實現跨表拖拽,多表聯動互相拖拽數據

vue 如何使用 vxe-table 來實現跨表拖拽,多表聯動互相拖拽數據 row-drag-config.isCrossTableDrag 啟用跨表格、多表格互相拖拽;跨表拖拽需要確保數據主鍵不重復,通過 row-config.keyField 指定主鍵字段名 查看官網:https://vxe…