MySQL中与浮点比较有关的问题

注意,下述部分主要与DOUBLE和FLOAT列相关,原因在于浮点数的不准确本质。MySQL使用64位十进制数值的精度执行DECIMAL操作,当处理DECIMAL列时,应能解决大多数常见的不准确问题。

浮点数有时会导致混淆,这是因为它们无法以准确值保存在计算机体系结构中。你在屏幕上所看到的值通常不是数值的准确值。对于FLOAT和DOUBLE列类型,情况就是如此。DECIMAL列能保存具有准确精度的值,这是因为它们是由字符串表示的。

在下面的示例中,介绍了使用DOUBLE时的问题:

mysql> CREATE TABLE t1 (i INT, d1 DOUBLE, d2 DOUBLE);
mysql> INSERT INTO t1 VALUES (1, 101.40, 21.40), (1, -80.00, 0.00),
-> (2, 0.00, 0.00), (2, -13.20, 0.00), (2, 59.60, 46.40),
-> (2, 30.40, 30.40), (3, 37.00, 7.40), (3, -29.60, 0.00),
-> (4, 60.00, 15.40), (4, -10.60, 0.00), (4, -34.00, 0.00),
-> (5, 33.00, 0.00), (5, -25.80, 0.00), (5, 0.00, 7.20),
-> (6, 0.00, 0.00), (6, -51.40, 0.00);
mysql> SELECT i, SUM(d1) AS a, SUM(d2) AS b
-> FROM t1 GROUP BY i HAVING a <> b;
+------+-------+------+
| i  | a   | b  |
+------+-------+------+
|  1 | 21.4 | 21.4 |
|  2 | 76.8 | 76.8 |
|  3 |  7.4 | 7.4 |
|  4 | 15.4 | 15.4 |
|  5 |  7.2 | 7.2 |
|  6 | -51.4 |  0 |
+------+-------+------+

结果是正确的。尽管前5个记录看上去不应能进行比较测试(a和b的值看上去没有什么不同),但它们能进行比较,这是因为显示的数值间的差异在十分位左右,具体情况取决于计算机的体系结构。

如果列d1和d2定义为DECIMAL而不是DOUBLE,SELECT查询的结果仅包含1行,即上面显示的最后1行。

时间: 2025-01-21 13:43:38

MySQL中与浮点比较有关的问题的相关文章

MySQL中的数据类型

MySQL中的数据类型 详情请访问官网:http://dev.mysql.com/doc/refman/5.7/en/data-types.html   官方文档:http://dev.mysql.com/doc/refman/5.7/en/opengis-geometry-model.html   1.1  MySQL有哪些数据类型? MySQL中定义数据字段的类型对数据库的优化是非常重要的.MySQL支持多种类型,大致可以分为三类:数值.日期/时间和字符串(字符)类型.   1.数值类型 表

MySQL中的SQRT函数的使用方法

  这篇文章主要介绍了详解MySQL中的SQRT函数的使用方法,是MySQL入门学习中的基础知识,需要的朋友可以参考下 MySQL的SQRT函数是用来计算出任何数量的平方根.可以使用SELECT语句找出方检定根的任意数如下: ? 1 2 3 4 5 6 7 mysql> select SQRT(16); +----------+ | SQRT(16) | +----------+ | 4.000000 | +----------+ 1 row in set (0.00 sec) 所看到的浮点值,

mysql中int(1)和int(11)区别详解

mysql字段定义中INT(x)中的x仅仅指的是显示宽度.该可选显示宽度规定用于显示宽度小于指定的列宽度的值时从左侧填满宽度.显示宽度并不限制可以在列内保存的值的范围,也不限制超过列的指定宽度的值的显示.所以x的定义与存储空间没有任何关系都是4个字节. 作为SQL标准的扩展,MySQL也支持整数类型TINYINT.MEDIUMINT和BIGINT.下面的表显示了需要的每个整数类型的存储和范围. 类型 字节 最小值 最大值     (带符号的/无符号的) (带符号的/无符号的) TINYINT 1

关于MYSQL中FLOAT和DOUBLE类型的存储

关于MYSQL中FLOAT和DOUBLE类型的存储 其实在单精度和双精度浮点类型存储中其存储方式和C/C++一致准守IEEE标准他们都是浮点型的,所谓的浮点型,是小数点的位置可变,其能够表示的范围比定点小数要广得多,而存储空间节省,但是受到精度的影响,所以在严格的数据中尽量使用定点小数mysql decimal(m,d)类型,ORACLE压根没有浮点数字类型而是number(p,s)定点小数, float 4字节     1       8      23   符号位   指数位 尾数 doub

MySQL中UTF8编码的数据在cmd下乱码

花了一下午,解决MySQL在Windows的cmd下中文乱码的问题. ? 1 2 3 4 5 6 7 8 9 10 11 12 13 mysql> use abc; Database changed mysql> select * from school; +----------+--------------------+-------------------------------------------+ | schoolid | name               | address 

python-关于mysql中的位图索引和位片索引问题

问题描述 关于mysql中的位图索引和位片索引问题 老师给了一个作业要求利用其他语言例如Python或者C++来实现位图索引,但是一直教的就是mysql,没要办法建位图索引啊.不知道怎么办才好了,求大神指导... 解决方案 Mysql 索引 解决方案二: http://www.cnblogs.com/yuerdongni/p/4255395.html

如何保护MySQL 中的重要数据

      在日常的工作中,保护数据免受未授权用户的侵犯是系统管理员特别关心的问题.如果你目前用的是MySQL,就可以使用一些方便的功能来保护系统,来大大减少机密数据被未授权用户访问的风险. 企业最有价值的资产通常是其数据库中的客户或产品信息.因此,在这些企业中,数据库管理的一个重要部分就是保护这些数据免受外部攻击,及修复软/硬件故障. 在大多数情况下,软硬件故障通过数据备份机制来处理.多数数据库都自带有内置的工具自动完成整个过程,所以这方面的工作相对轻松,也不会出错.但麻烦却来自另一面:阻止外

MySQL中处理空值时要小心两个陷阱

  MySQL数据库是一个基于结构化数据的开源数据库.SQL语句是MySQL数据库中核心语言.不过在MySQL数据库中执行SQL语句,需要小心两个陷阱. 陷阱一:空值不一定为空 空值是一个比较特殊的字段.在MySQL数据库中,在不同的情形下,空值往往代表不同的含义.这是MySQL数据库的一种特性.如在普通的字段中(字符型的数据),空值就是表示空值.但是如果将一个空值的数据插入到TimesTamp类型的字段中,空值就不一定为空.此时为出现什么情况呢(如下图)? 我先创建了一个表.在这个表中有两个字

细细研究MySql中delimiter起到的作用

MySql中delimiter究竟可以起到些什么作用呢?可能不少人都有这样的疑惑,下文就为您介绍MySql中delimiter的作用,供您参考. MYSQL导出一个SQL后: DELIMITER $$      DROP TRIGGER IF EXISTS `updateegopriceondelete`$$      CREATE          TRIGGER `updateegopriceondelete` AFTER  DELETE ON  `customerinfo`