【送书活动二期】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.hqwc.cn/news/230643.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

一个00后女生在csdn创作1095的创作纪念日

大家好,我是你们熟悉的微枫奶糖 肥晨,今天收到私信,突然发现,我来到CSDN已经1095天了。让我来分享一下吧~ 机缘 不知不觉来csdn已经1095天了,祝贺我在CSDN的创作纪念日! 这是一个非常值得纪念的日子&…

PlantUML语法(全)及使用教程-类图

目录 1. 类图1.1、什么是类图1.2、元素声明1.3、类之间的关系1.4、关系上的标签1.5、在元素名称和关系标签中使用非字母1.6、添加方法 1. 类图 类图的设计语法与编程语言的传统语法相似。这种相似性为开发人员提供了一个熟悉的环境,从而使创建图表的过程更简单、更直…

编程实现bf算法

BF算法(Brute Force算法)是一种朴素的字符串匹配算法,其基本思想是在文本串中不断地比较模式串和文本串中的子串,直到找到匹配的位置或者搜索完整个文本串。 下面是用Python实现BF算法的代码: def bf_search(text, p…

【Openstack Train安装】十、Neutron安装

Neutron,是Openstack中的一大核心组件,设计目标是实现“网络即服务(Networking as a Service)”。为了达到这一目标,在设计上遵循了基于 SDN 实现网络虚拟化的原则,在实现上充分利用了 Linux 系统上的各种网…

【LeetCode】每日一题 2023_11_29 无限集中的最小数字(哈希/堆)

文章目录 刷题前唠嗑题目:无限集中的最小数字题目描述代码与解题思路偷看大佬题解 结语 刷题前唠嗑 LeetCode?启动!!! 今天的题目也比较的简单,因为数据量不大,所以什么做法都能过的去 题目&a…

Django快速搭建静态网页

Django的快速搭建 这个是例子 这个是一个目录 项目名称:项目似乎被命名为DJ0928,这是Django项目的根目录。 文件都是Django项目的核心配置文件。 settings.py 包含了项目的配置设置。urls.py 定义了项目的URL路由。wsgi.py 和 asgi.py 分别用于Web服务器…

Java实现通过经纬度求两个任意地点在球面上的距离

我们在实际开发中会获取对应的经纬度,可以使用ES大数据搜索引擎进行计算对应区域的数据,那我们在如何根据两个经纬度获取对应的球面距离,就是在地球上从一个地点到另一个地点的直线距离 工具类如下: public class GeoUtils {// 地球半径&am…

AI视频智能分析识别技术的发展与EasyCVR智慧安防视频监控方案

随着科技的不断进步,基于AI神经网络的视频智能分析技术已经成为了当今社会的一个重要组成部分。这项技术通过利用计算机视觉和深度学习等技术,实现对视频数据的智能分析和处理,从而为各个领域提供了广泛的应用。今天我们就来介绍下视频智能分…

利用kibana 快照备份es数据库

环境 主机名ip地址组件ambari-hadoop1192.168.10.101ambari-hadoop2192.168.10.102kibanaambari-hadoop3192.168.10.103es 这里我们利用共享文件系统,存储快照,所以需要利用到nfs(NFS(Network File System)是一种分布…

自动化测试工具——Monkey

前言: 最近开始研究Android自动化测试方法,整理了一些工具、方法和框架,其中包括android测试框架,CTS、Monkey、Monkeyrunner、benchmark,以及其它test tool等等。 一、 什么是Monkey Monkey是Android中的一个命令…

EnlighenGAN 使用指南:将暗光图像点亮,焕发光彩

EnlighenGAN 使用指南 EnlightenGAN 网络结构 生成器(带自注意力机制的 U-Net) 判别器(两个全局-局部鉴别器)优化目标环境搭建和训练自己的数据 暗光图像增强: 优点在于,可以不用成对数据,一个…

视频监控管理平台/智能监测/检测系统EasyCVR设备列表显示不全是什么原因?该如何解决?

GB28181视频监控国标平台/视频云存储/安防监控EasyCVR视频汇聚平台,基于云边端智能协同,支持海量视频的轻量化接入与汇聚、转码与处理、全网智能分发、视频集中存储等。智慧安防视频平台EasyCVR拓展性强,视频能力丰富,具体可实现视…