mysql下float类型一些误差详解

我想很多朋友都不怎么会在mysql中使用float类型,特别是用到金钱时我们可能会用双精度来做,我们知道mysql的float类型是单精度浮点类型不小心就会导致数据误差

单精度浮点数用4字节(32bit)表示浮点数
采用IEEE754标准的计算机浮点数,在内部是用二进制表示的
如:7.22用32位二进制是表示不下的。
所以就不精确了。
mysql中float数据类型的问题总结 
 
对于单精度浮点数Float:  当数据范围在±131072(65536×2)以内的时候,float数据精度是正确的,但是超出这个范围的数据就不稳定,没有发现有相关的参数设置建议:将float改成double或者decimal,两者的差别是double是浮点计算,decimal是定点计算,会得到更精确的数据。

1.float类型
float列类型默认长度查不到结果,必须指定精度,
比如 num  float,  insert into  table (num) values (0.12); select  * from table where num=0.12的话,empty set。

 代码如下复制代码 num float(9,7),  insert into  table (num) values (0.12); select  * from table where num=0.12的话会查到这条记录。
 
mysql> create table tt
    -> (  
    -> num  float(9,3)
    -> );
Query OK, 0 rows affected (0.03 sec)
 
mysql> insert into tt(num)values(1234567.8);
ERROR 1264 (22003): Out of range value for column ‘num’ at row 1

注:超出字段范围,无法插入
 

 代码如下复制代码 mysql> insert into tt(num)values(123456.8);
Query OK, 1 row affected (0.00 sec)
 
mysql> select  * from  tt;
+————+
| num        |
+————+
| 123456.797 |
+————+
1 row in set (0.00 sec)

注:小数位数不够,自动补齐,但是存在一个问题就是如上的近似值。
 

 代码如下复制代码 mysql> insert into tt(num)values(123456.867);
Query OK, 1 row affected (0.04 sec)
 
mysql> select * from   tt;
+————+ 
| num        |
+————+
| 123456.797 |
| 123456.797 |
| 123456.867 |
+————+
3 rows in set (0.00 sec)
 
mysql> select  * from tt where  num=123456.867;
+————+
| num        |
+————+
| 123456.867 |
+————+
1 row in set (0.00 sec)
 
mysql> insert into tt(num)values(2.8);
Query OK, 1 row affected (0.04 sec)
 
mysql> select * from   tt;
+————+
| num        |
+————+
| 123456.797 |
| 123456.797 |
| 123456.867 |
|      2.800 |
+————+
4 rows in set (0.00 sec)
 
mysql> select  * from tt where  num=2.8;
+——-+ 
| num   |
+——-+
| 2.800 |
+——-+
1 row in set (0.00 sec)
 
mysql> insert into tt(num)values(2.888888);
Query OK, 1 row affected (0.00 sec)
 
mysql> select  * from  tt;
+————+
| num        |
+————+
| 123456.797 |
| 123456.797 |
| 123456.867 |
|      2.800 |
|      2.889 |
+————+
5 rows in set (0.00 sec)

注:小数位数超了,自动取近似值。
————————————————————————————–
一、浮点数的概念及误差问题

浮点数是用来表示实数的一种方法,它用 M(尾数) * B( 基数)的E(指数)次方来表示实数,相对于定点数来说,在长度一定的情况下,具有表示数据范围大的特点。但同时也存在误差问题,这就是著名的浮点数精度问题!浮点数有多种实现方法,计算机中浮点数的实现大都遵从 IEEE754 标准,IEEE754 规定了单精度浮点数和双精度浮点数两种规格,单精度浮点数用4字节(32bit)表示浮点数,格式是:1位符号位 8位表示指数 23位表示尾数    双精度浮点数8字节(64bit)表示实数,格式是:1位符号位 11位表示指数 52位表示尾数    同时,IEEE754标准还对尾数的格式做了规范:d.dddddd…,小数点左面只有1位且不能为零,计算机内部是二进制,因此,尾数小数点左面部分总是1。显然,这个1可以省去,以提高尾数的精度。由上可知,单精度浮点数的尾数是用24bit表示的,双精度浮点数的尾数是用53bit表示的,转换成十进制:
2^24 – 1 = 16777215;  2^53 – 1 = 9007199254740991
由上可见,IEEE754单精度浮点数的有效数字二进制是24位,按十进制来说,是8位;双精度浮点数的有效数字二进制是53位,按十进制来说,是16 位。显然,如果一个实数的有效数字超过8位,用单精度浮点数来表示的话,就会产生误差!同样,如果一个实数的有效数字超过16位,用双精度浮点数来表示,也会产生误差!对于 1310720000000000000000.66 这个数,有效数字是24位,用单精度或双精度浮点数表示都会产生误差,只是程度不同:  
单精度浮点数:1310720040000000000000.00;双精度浮点数: 1310720000000000000000.00
可见,双精度差了 0.66 ,单精度差了近4万亿!
以上说明了因长度限制而造成的误差,但这还不是全部!采用IEEE754标准的计算机浮点数,在内部是用二进制表示的,但在将一个十进制数转换为二进制浮点数时,也会造成误差,原因是不是所有的数都能转换成有限长度的二进制数。对于131072.32 这个数,其有效数字是8位,按理应该能用单精度浮点数准确表示,为什么会出现偏差呢?看一下这个数据二进制尾数就明白了 10000000000000000001010001……     显然,其尾数超过了24bit,根据舍入规则,尾数只取 100000000000000000010100,结果就造成测试中遇到的“奇怪”现象!131072.68 用单精度浮点数表示变成 131072.69 ,原因与此类似。实际上有效数字小于8位的数,浮点数也不一定能精确表示,7.22这个数的尾数就无法用24bit二进制表示,当然在数据库中测试不会有问题(舍入以后还是7.22),但如果参与一些计算,误差积累后,就可能产生较大的偏差。

二、mysql 和 oracle中的数值类型

问题是不是只有 mysql 存在呢?显然不是,只要是符合IEEE754标准的浮点数实现,都存在相同的问题。
mysql中的数值类型(不包括整型):
IEEE754浮点数:float(单精度),double或real(双精度)  
定点数:decimal或numeric
oracle中的数值类型:
oracle 浮点数 :number(注意不指定精度)  
IEEE754浮点数:BINARY_FLOAT(单精度),BINARY_DOUBLE(双精度)FLOAT,FLOAT(n) (ansi要求的数据类型)
定点数:number(p,s)
如果在oracle中,用BINARY_FLOAT等来做测试,结果是一样的。因此,在数据库中,对于涉及货币或其他精度敏感的数据,应使用定点数来存储,对mysql来说是 decimal,对oracle来说就是number(p,s)。双精度浮点数,对于比较大的数据同样存在问题!

三、编程中也存在浮点数问题

不光数据库中存在浮点数问题,编程中也同样存在,甚至可以说更值得引起注意!
通过上面的介绍,浮点数的误差问题应该比较清楚了。如果在程序中做复杂的浮点数运算,误差还会进一步放大。因此,在程序设计中,如果用到浮点数,一定要意识到可能产生的误差问题。不仅如此,浮点数如果处理不好,还会导致程序BUG!看下面的语句:if (x != y) { z = 1 / (x -y);}这个语句看起来没有问题,但如果是浮点数,就可能存在问题!再看下面的语句会输出什么结果: public class Test { public static void main(String[]args) throws Exception { System.out.print(“7.22-7.0=” + (7.22f-7.0f)); } }     我们可能会想当然地认为输出结果应该是 0.22 ,实际结果却是 0.21999979 !
 因此,在编程中应尽量避免做浮点数的比较,否则可能会导致一些潜在的问题!除了这些,还应注意浮点数中的一些特殊值,如 NaN、+0、-0、+无穷、-无穷等,IEEE754虽然对此做了一些约定,但各具体实现、不同的硬件结构,也会有一些差异,如果不注意也会造成错误!

四、总结:

从上面的分析,我们可以得出以下结论:

文心大模型 文心大模型

百度飞桨-文心大模型 ERNIE 3.0 文本理解与创作

文心大模型 56 查看详情 文心大模型

1、浮点数存在误差问题;
2、对货币等对精度敏感的数据,应该用定点数表示或存储;
3、编程中,如果用到浮点数,要特别注意误差问题,并尽量避免做浮点数比较;
4、要注意浮点数中一些特殊值的处理

注意事项

MYSQL 5.022中,
如果某个字段 f是float类型,那么在查询的时候,sql语句为:
select * from T where f = 2.2;
那么即使表中有2.2的数据也不能被查询到.

此时解决方法有2种:
1.将float改为double类型,不会出现这种问题.但是如果数据库中数据量庞大,或者修改量太大,则不适合这个方法.这个方法只适合设计数据库的初期阶段.
2.设置float的精度然后进行查询就可以了.
如果要精确到3位,则:select * from T where format(f,3) = format(2.2,3);

但是,精度不能超过6.否则出错.因为float类型最多允许精确到小数点后6位.

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/488721.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月8日 14:45:41
下一篇 2025年11月8日 14:47:47

相关推荐

  • 网络进化!

    Web 应用程序从静态网站到动态网页的演变是由对更具交互性、用户友好性和功能丰富的 Web 体验的需求推动的。以下是这种范式转变的概述: 1. 静态网站(1990 年代) 定义:静态网站由用 HTML 编写的固定内容组成。每个页面都是预先构建并存储在服务器上,并且向每个用户传递相同的内容。技术:HT…

    2025年12月24日
    000
  • 为什么多年的经验让我选择全栈而不是平均栈

    在全栈和平均栈开发方面工作了 6 年多,我可以告诉您,虽然这两种方法都是流行且有效的方法,但它们满足不同的需求,并且有自己的优点和缺点。这两个堆栈都可以帮助您创建 Web 应用程序,但它们的实现方式却截然不同。如果您在两者之间难以选择,我希望我在两者之间的经验能给您一些有用的见解。 在这篇文章中,我…

    2025年12月24日
    000
  • CSS中float布局介绍

    CSS中的float布局介绍 在网页开发中,我们经常会用到CSS来控制页面的样式和布局。其中,float布局是一种常用的布局方式。它可以实现元素的浮动效果,使得多个元素并排显示。本文将介绍float布局的用法和常见应用,并提供具体的代码示例。 一、float布局的用法 使用float属性 在CSS中…

    2025年12月24日
    000
  • CSS 相对布局属性详解:position 和 relative

    CSS 相对布局属性详解:position 和 relative 在前端开发中,布局常常是开发者需要面对的问题,为了更好地控制元素在页面中的位置,CSS 提供了多种布局方式。其中,相对布局是一种非常常用的布局方式,通过使用 position 和 relative 属性,我们能够灵活地调整元素的位置和…

    2025年12月24日
    000
  • CSS 表格布局属性解读:table 和 display

    CSS 表格布局属性解读:table 和 display 在前端开发中,表格布局是常用的一种布局方式。CSS提供了一些表格布局属性,其中最常用的是table和display属性。下面将详细解读这两个属性,并给出具体的代码示例。 一、table 属性 table是CSS中用于设置元素为表格布局的属性。…

    2025年12月24日
    000
  • CSS 重叠属性解析:position 和 float

    CSS 重叠属性解析:position 和 float 在CSS中,position和float 是两个常用的重叠属性,它们可以改变元素的布局行为,实现各种复杂的页面效果。本文将详细解析这两个属性,并给出具体的代码示例。 一、position 属性 position属性定义了元素的定位方式,常用的取…

    2025年12月24日
    000
  • css中如何清除float

    css中清除float的方法是,为父元素设置【overflow:auto】。设置之后,内容元素会被修剪,超出元素将不可见。我们还可以通过增加空标签,或者使用【:after】伪元素来清除float。 本文操作环境:windows10系统、css 3、thinkpad t480电脑。 我们先来说下清除浮…

    2025年12月24日
    000
  • CSS中元素的浮动用什么属性

    CSS中元素的浮动用float属性。float属性用于定义元素在哪个方向浮动;元素使用了float属性后,可以使该元素脱离标准流本身,浮动在其他元素之上,使其不再占用原本属于该元素的空间,但也会导致后面的元素上移并占用原本属于该元素的空间。 本教程操作环境:windows7系统、CSS3&&…

    2025年12月24日
    000
  • css浮动的属性是什么

    css浮动的属性是指“float”属性,用于指定一个盒子(元素)是否应该浮动,定义朝哪个方向浮动。元素使用了float属性后,可以使该元素脱离标准流本身,浮动在其他元素之上,使其不再占用原本属于该元素的空间。 本文操作环境:windows10系统、css3版本,Dell G3电脑。 1. 页面布局方…

    2025年12月24日 好文分享
    000
  • 如何解决css float错位问题

    css float错位的解决办法:1、当两个同级的元素发生错位时,在两个元素之间添加一个空标签;2、设置CSS属性为“.clear{clear:both;}”即可。 本教程操作环境:windows7系统、css3版、thinkpad t480电脑。 推荐:《css视频教程》 float属性使用后导致…

    2025年12月24日
    000
  • 为什么要清除浮动?怎样清除?(float)

    一、理解清除浮动 1、为什么要清除浮动 我们前面说过,浮动本质是用来做一些文字混排效果的,但是被我们拿来做布局用,则会有很多的问题出现。 由于浮动元素不再占用原文档流的位置,所以它会对后面的元素排版产生影响,为了解决这些问题,此时就需要在该元素中清除浮动。 推荐学习:CSS视频教程 准确地说,并不是…

    2025年12月24日 好文分享
    000
  • css左浮动怎么写?

    在css中可以通过float属性来定义元素在哪个方向浮动;想要左浮动则只需将元素的float属性的值设置为left(float:left)即可。下面就来给大家介绍一下float属性,希望对你们有所帮助。 css float属性 float 属性指定一个盒子(元素)是否应该浮动,在哪个方向浮动。浮动元…

    2025年12月24日
    000
  • CSS布局中flex、grid以及float属性之间的差别是什么

    在CSS布局中,flex、grid以及float属性的差别是flex属性适用于小的UI元素,grid属性适合用于为网站整体进行布局而float属性适合在较大的文本文章中设置图像 平时我们在写页面时为了实现各种网络布局,常常会用到flex或者grid以及float属性。每一种布局技术都有其优缺点,接下…

    2025年12月24日 好文分享
    000
  • 清除浮动的方法有哪些

    清除浮动的方法有clearboth的方法、设置clearfix的方法、overflow的方法以及给父元素设置双伪元素的方法 在我们写代码的时候,有时因为使用了float浮动元素而导致页面中某些元素不能正确的显示,接下来在文章中将为大家详细介绍几种清除浮动的方法,具有一定的参考价值,希望对大家有所帮助…

    2025年12月24日
    000
  • CSS如何实现任意角度的扇形(代码示例)

    本篇文章给大家带来的内容是关于CSS如何实现任意角度的扇形(代码示例),有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。 扇形制作原理,底部一个纯色原形,里面2个相同颜色的半圆,可以是白色,内部半圆按一定角度变化,就可以产生出扇形效果 扇形绘制 .shanxing{ position:…

    2025年12月24日
    000
  • float是什么?float属性详解

    float是什么?为什么要使用float?本篇文章就给大家介绍float是什么,让大家了解浮动对布局的作用,清除浮动的方法。有一定的参考价值,有需要的朋友可以参考一下,希望对你们有所帮助。 首先我们来了解一下float是什么? float是css的一个定位属性。要了解它的目的和来源,我们可以看一下印…

    2025年12月24日 好文分享
    000
  • css中如何设置float浮动居中?

    在css的float属性中有float:right向右浮动,float:left向左浮动,但是却没有设置居中的属性,那么如果我们想要实现float属性居中该怎么办呢?本篇文章就来给大家介绍有关于css中float属性居中的方法。 我们经常在做导航条的时候会用到浮动居中,下面我们就用实现导航条的浮动居…

    2025年12月24日
    000
  • 当float属性导致换行后,应该怎么处理?

    页面布局离不开float浮动的使用,当float属性导致换行后,应该怎么处理?想知道的小伙伴继续往下看吧,希望可以帮助到你。 在h5开发中,经常会使用float属性来解决一些布局问题。但在某些复杂的布局中也会遇到使用float属性是导致一行中的元素无法对齐或者float元素换行等现象。在遇到这种问题…

    好文分享 2025年12月24日
    000
  • css中Float属性详解

    这次给大家带来css中Float属性详解,使用css中Float属性的注意事项有哪些,下面就是实战案例,一起来看一下。 一、Float的特性 1. 应用于文字围绕图片 2. 创建一个块级框 3. 多列浮动布局 4. 浮动元素的宽度、高度自适应,但可以设置其值。 二、核心解决的问题 文字围绕图片:im…

    2025年12月24日 好文分享
    000
  • css中的float的图文详解

    这次给大家带来css中的float的图文详解,float的图文详解的注意事项有哪些,下面就是实战案例,一起来看一下。 float与margin 两个相邻的浮动元素,当第一个浮动元素(不论是左浮动还是右浮动)的宽度为100%时,第二个浮动元素会被挤到下面,通过添加负margin-right值(绝对值最…

    2025年12月24日
    000

发表回复

登录后才能评论
关注微信