当前位置: 首页 > article >正文

【送书活动二期】Java和MySQL数据库中关于小数的保存问题

之前总结过一篇文章mysql数据库:decimal类型与decimal长度用法详解,主要是个人学习期间遇到的mysql中关于decimal字段的详解,最近在群里遇到一个小伙伴提出的问题,也有部分涉及,今天就再大致总结一下Java和MySQL数据库中关于小数的保存问题

目录

  • Java 中的小数类型
    • float
    • double
    • BigDecimal
  • MySQL 中的小数类型
    • 1. FLOAT
    • 2. DOUBLE
    • 3.Float
  • 对比分析
    • 1. 精度要求
    • 2. 存储空间
    • 3. 舍入误差
  • 书籍推荐
    • 书籍名称:《Java图解创意编程:从菜鸟到互联网大厂之路》
    • 内容介绍
    • 适合人群
    • 如何领书

Java 中的小数类型

在Java中,小数的表示主要依赖于两个基本数据类型:float和double。这两种类型都是浮点类型,但它们在精度和存储空间上有所不同。

float

单精度浮点数,字节数为 4,占用32位,整数部分最多 7 位,小数部分最多 7 位,取值范围太小,几乎没有用,但通常用于节省内存空间。

double

双精度浮点数,字节数为 8,占用64位,整数部分最多 15 位,小数部分最多 15 位,基本够用,计算金钱可以达到1 亿亿以内的范围;提供更高的精度,但占用更多的内存空间。

BigDecimal

比较大的小数只能使用 BigDecimal 来接收,MySQL 数据库 decimal 可以保存最多 65 位的小数,但是 double只能接收差不多 15 位的小数。

数据库获取到数据需要转换成字符串类型,然后再使用 BigDecimal(String) 构造器将数值封装成一个 BigDecimal 对象。

在实际开发中,选择合适的类型要根据精度和内存占用的平衡,以满足业务需求。


MySQL 中的小数类型

MySQL中提供了多种小数类型,主要包括FLOAT、DOUBLE、DECIMAL。每种类型都有其独特的特点。

1. FLOAT

单精度浮点数,适用于需要较大范围的数值,但对精度要求不高的情况。
用于表示近似数值数据类型。SQL 标准允许在关键字 float 后面的括号内选择用位指定精度(但不能为指数范围)。0 到 23 的精度对应 float 列的 4 字节单精度。

myfloat FLOAT(8,4);

例如上面,定义为 float(8,4) 的一个列可以显示为 -9999.9999。MySQL 保存值时进行四舍五入,因此如果在 float(8,4) 列内插入 9990.00009,近似结果是 9990.0001。

⚠️:float 数据在运算时,如果数字溢出不会报错,会有精度的损失。

2. DOUBLE

双精度浮点数,提供更高的精度,适用于对数值精度要求较高的场景。
可以设置保留的小数个数。decimal(m,d),表示该值一共显示 m 位整数,其中 d 位位于小数点后面。

decimal 和 numeric 类型在 MySQL 中视为相同的类型。它们用于保存必须为确切精度的值,例如货币数据。当声明该类型的列时,可以(并且通常要)指定精度和标度。
例如:

salary decimal(5,2)

在该例子中,5 是精度,2 是标度。精度表示保存值的主要位数,标度表示小数点后面可以保存的位数。

在标准SQL中,语法 decimal(m) 等价于 decimal(m,0)。同样,语法 decimal 等价于vdecimal(m,0),可以通过计算确定 m 的值。在MySQL 5.1中支持 decimal 和 numeric 数据类型的变量形式。m 默认值是 10。

decimal 或 numeric 的最大位数是 65,但具体的 decimal 或 numeric
列的实际范围受具体列的精度或标度约束。如果此类列分配的值小数点后面的位数超过指定的标度允许的范围,值被转换为该标度。(具体操作与操作系统有关,但一般结果均被截取到允许的位数)。

注:当对 decimal 类型的数据进行运算操作时,如果数值溢出会报错。

3.Float

单精度浮点数,适用于需要较大范围的数值,但对精度要求不高的情况。用于表示近似数值数据类型。
SQL 标准允许在关键字 float后面的括号内选择用位指定精度(但不能为指数范围)。0 到 23 的精度对应 float 列的 4 字节单精度。

例如,定义为 float(7,4) 的一个列可以显示为 -999.9999。MySQL 保存值时进行四舍五入,因此如果在 float(7,4) 列内插入 999.00009,近似结果是 999.0001。

注:float 数据在运算时,如果数字溢出不会报错,会有精度的损失。


对比分析

1. 精度要求

  • 如果业务对小数的精度要求较低,且对内存占用有要求,可以选择使用float。
  • 如果需要更高的精度,但仍然可以容忍一定的舍入误差,可以选择使用double。
  • 如果业务对小数的精度要求非常高,且不能容忍任何误差,应该选择DECIMAL。

2. 存储空间

  • float占用4字节,适用于存储较大范围的数值。
  • double占用8字节,提供更高的精度,但占用更多的存储空间。
  • DECIMAL的存储空间与精度有关,但通常比double更节省存储空间。

3. 舍入误差

  • 浮点数(float和double)在进行计算时可能存在舍入误差,因为它们是基于二进制表示的,而十进制小数无法精确表示为二进制小数。
  • DECIMAL类型是基于十进制的,不会出现浮点数的舍入误差,适用于对精度要求极高的场景。

书籍推荐

这是一本兼具趣味性、实用性、广泛性的好书,简直是编程小白的福音!
一、深入浅出,用可视化项目让读者体验动手创造世界的编程成就感。
二、理论和工程相结合,在动手的同时夯实基础,让读者更直观地理解数据结构、算法、网络等计算机底层原理。
三、通过代码级别的讲解,让初学者有机会在自学过程中丰富自己的实战经验,接触到业界流行的技术框架,为未来实习和进入职场打下坚实基础。

书籍名称:《Java图解创意编程:从菜鸟到互联网大厂之路》

在这里插入图片描述

内容介绍

本书从问题入手,使用100多个创意编程范例,试图在深入理解原理的基础上,通过自造“轮子”帮助读者提升代码编写功底和工程实现能力。全书分为12章,内容包括Java入门、分形图像处理、数据结构、网络通信、动态装载、多线程、Raft协议、分布式编程和ZooKeeper框架等,由浅入深实现“美颜相机”“迷你通信会议”“迷你Web服务器”“迷你Raft”等项目。本书针对每一个范例,首先给出代码实现和重要知识点,然后提出任务以使读者发挥创意,提升代码编写技能。

适合人群

本书由浅入深,有趣有料,适合想提升代码编写水平的大学生、求职者、编程爱好者阅读,也适合有1~2年开发经验的程序员参考,还可以作为各类培训班的培训教材

如何领书

————————————————
本次本篇文章送书 🔥2-3本 评论区抽2-3位小伙伴送书
📆 活动时间:截止到 2023-12-06 20:00:00
🎁抽奖方式:利用网络公开的在线抽奖工具进行抽奖
💡参与方式:关注、点赞、收藏,评论 “人生苦短,我要去大厂搬砖”
根据文章阅读量的多少来安排送书的本数。
————————————————

🔥 注:活动结束后,会私信中奖粉丝的,各位注意查看私信哦!

小伙伴也可以访问链接进行自主购买哦~
直达京东购买链接:《Java图解创意编程:从菜鸟到互联网大厂之路》


http://www.kler.cn/a/149904.html

相关文章:

  • 使用VSCode远程连接服务器并解决Neo4j无法登陆问题
  • 超子物联网HAL库笔记:定时器[外部模式]篇
  • 微信小程序_模板与配置_day2
  • iOS 18.2 重磅更新:6个大动作
  • Java static静态变量 C语言文件读写
  • 计算机毕业设计Python+大模型斗鱼直播可视化 直播预测 直播爬虫 直播数据分析 直播大数据 大数据毕业设计 机器学习 深度学习
  • Fuzz进阶教学——人工智能在模糊测试中的应用
  • Linux使用宝塔面板+Discuz+cpolar内网穿透工具搭建可公网访问论坛
  • nodejs669在线图书借阅管理系统vue前端
  • 第20章 多线程
  • Vue框架学习笔记——Vue实例中el和data的两种写法
  • Redis 基础、字符串、哈希、有序集合、集合、列表以及与 Jedis 操作 Redis 和与 Spring 集成。
  • 【备忘录】快速回忆ElasticSearch的CRUD
  • Linux: Ftrace: function_graph 里面有irq处理的函数
  • Linux使用固定ip地址
  • Linux MYSQL-5.7.23-rpm安装(附带安装包)
  • 基于深度学习的点云三维目标检测方法综述
  • 算法基础之KMP算法
  • PHP连接数据库 错误抑制 三元运算符 学习资料
  • 解决PDF预览时,电子签章、日期等不显示问题
  • 基于springboot实现农机电招平台系统项目【项目源码+论文说明】计算机毕业设计
  • einj 注入内存ue/ce故障
  • 人工智能_机器学习055_拉格朗日乘子法_拉格朗日乘数法的原理介绍_流程详解---人工智能工作笔记0095
  • 团购生鲜系统丨分销丨外卖丨跑腿丨app小程序H5,源码交付,支持二开!
  • 轻松整合Knife4j:快速搭建Swagger文档界面与接口调试
  • 面试题背诵,回答的思路和模板,思路清晰