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…