如有疑问请联系微信:onesoft007 

     在计算机中,浮点数往往很难精确表示,那么浮点数运算结果也往往难以精确表示。MySQL同样也存在这个问题,并表现在如下几个方面。

问题

1、相同的输入,可能造成不一样的输出(受CPU、编译器等影响) 

  a)下面是MySQL官方网站给出的例子

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 |
+------+-------+------+

  当i=1时,a=21.4、b=21.4,本不满足a<>b这个条件,可是MySQL仍然判定a与b不相等。

b)在本地虚拟机测试时(Centos 6.4 X86_64)

+------+--------------------+------+
| i | a | b |
+------+--------------------+------+
| 1 | 21.400000000000006 | 21.4 |
| 2 | 76.80000000000001 | 76.8 |
| 3 | 7.399999999999999 | 7.4 |
| 4 | 15.399999999999999 | 15.4 |
| 5 | 7.199999999999999 | 7.2 |
| 6 | -51.4 | 0 |
+------+--------------------+------+ 2、结果受浮点数本身的精确度影响
  把double改成float,结果如下
+------+---------------------+--------------------+
| i | a | b |
+------+---------------------+--------------------+
| 1 | 21.400001525878906 | 21.399999618530273 |
| 2 | 76.79999828338623 | 76.80000114440918 |
| 3 | 7.399999618530273 | 7.400000095367432 |
| 5 | 7.200000762939453 | 7.199999809265137 |
| 6 | -51.400001525878906 | 0 |
+------+---------------------+--------------------+
解决方案
1、decimal
  在MySQL中,带有小数的精确运算可以使用decimal类型
  CREATE TABLE t3 (i INT, d1 decimal(10,3), d2 decimal(10,3));
  +------+---------+-------+
  | i | a | b |
  +------+---------+-------+
  | 6 | -51.400 | 0.000 |
  +------+---------+-------+
限制
  decimal的精确表示为decimal(M,D),其中M最大为65,D最大为30。因此其表示的范围是远远小于double所能表示的范围 2、基于应用的解决方案
  比如商品价格涉及到小数,用20.95元表示,那么可以把价格变成以分为单位,即变成2095。 结论
  
不要使用float、double以及其等价类型做精确计算。如果要在MySQL中做精确计算,推荐使用decimal或者将相关计算任务交给应用。

如有疑问请联系微信:onesoft007

MySQL浮点计算存在的问题与解决方案的更多相关文章

  1. MySQL千万级大表优化解决方案

    MySQL千万级大表优化解决方案 非原创,纯属记录一下. 背景 无意间看到了这篇文章,作者写的很棒,于是乎,本人自私一把,把干货保存下来.:-) 问题概述 使用阿里云rds for MySQL数据库( ...

  2. mysql实时同步到mssql的解决方案

    数据库在应用程序中是必不可少的部分,mysql是开源的,所以很多人它,mssql是微软的,用在windows平台上是非常方便的,所以也有很多人用它.现在问题来了,如何将这两个数据库同步,即数据内容保持 ...

  3. MYSQL Error 2006HY000:MySQL server has gone away的解决方案

    MySQL server has gone away有几种情况. 1.应用程序(比如PHP)长时间的执行批量的MYSQL语句. 最常见的就是采集或者新旧数据转化. 解决方案: 在my.cnf文件中添加 ...

  4. mysql 海量数据的存储和访问解决方案

    第1章  引言 随着互联网应用的广泛普及,海量数据的存储和访问成为了系统设计的瓶颈问题.对于一个大型的互 联网应用,每天几十亿的PV无疑对数据库造成了相当高的负载.对于系统的稳定性和扩展性造成了极大的 ...

  5. 使用EF操作Mysql数据库中文变问号的解决方案

    问题场景:使用Entity Framework 6.0 操作Mysql数据库,中文保存至数据库后全部变成问号.但是使用Mysql API却不会. 原因排查:首先想到的肯定是数据库编码问题,一次查询了表 ...

  6. xampp使用中mysql端口被占用问题的解决方案

    如果在安装XAMPP前本机已经安装了mysql,并且添加了Windows服务中 使用xampp时,两个Mysql在Windows服务中有冲突 这意味着你之前在电脑上使用过mysql,路径.端口都被占用 ...

  7. MySQL数据库创建表报错的解决方案

    实体类 package com.tao.pojo; public class Student { private String id; private String name; private Str ...

  8. 谈谈Mysql主从同步延迟分析及解决方案

    一.MySQL的数据库主从复制原理 MySQL主从复制实际上基于二进制日志,原理可以用一张图来表示: 分为四步走: 1. 主库对所有DDL和DML产生的日志写进binlog: 2. 主库生成一个 lo ...

  9. Navicat 连接MySQL时出现1251错误的解决方案

    我用的MySQL版本是8.0.11,比较新的MySQL版本中采用的加密方式与旧的不同,从而导致1251错误. 解决方案:打开终端连接上数据库,执行以下语句,问题解决.(自己遇到过的坑,亲测有效) US ...

随机推荐

  1. Synchronized 个人深解

      1.synchronized方法相当于synchronized(this)      Synchronized 方法是锁的当前对象,同一个对象的2个synchronized方法被2个线程调用会发生 ...

  2. HTTP协议上传boundary确定&下载content-disposition理解

    HTTP协议上传文件-协议 上传文件需要将form标签 的 ENCTYPE 属性设置为 multipart/form-data属性, 与 application/x-www-form-urlencod ...

  3. 成都PC网站建设需要考虑哪些费用呢

    亿合科技PC建设小编分享下:成都PC网站建设需要考虑哪些费用呢?随互联网的发展,越来越多人想建设自己网站,站长最关心的问题之一就是网站建设需要多少钱.每个网站建设的费用都是不一样的,但是都需要涵盖几个 ...

  4. selenium and win32api

    I:Web 测试 selenium-2.45.0 python 2.7.8 win32api http://sourceforge.net/projects/pywin32/files/pywin32 ...

  5. CAS无锁算法与ConcurrentLinkedQueue

    CAS:Compare and Swap 比较并交换 java.util.concurrent包完全建立在CAS之上的,没有CAS就没有并发包.并发包借助了CAS无锁算法实现了区别于synchroni ...

  6. 《30天自制操作系统》12_day_学习笔记

    harib09a: 定时器:(Timer)每隔一段时间,会向CPU发送一个中断.这样CPU不用记住每一条指令的执行时间.没有定时器很多指令CPU都很难执行.例如HLT指令,这个指令的执行时间不是个固定 ...

  7. s3c2440 mpll

    S3C2440有两个PLL(phase locked loop)一个是MPLL,一个是UPLL.MPLL用于CPU及其他外围器件,UPLL用于USB.用于产生FCLK, HCLK, PCLK三种频率, ...

  8. SQL中插入单引号,新增修改删除

    1.插入单引号如果不转化的话,字符串插入到数据库中错误的,只要在字符串中有单引号的地方在加一个单引号即可.    例如:在数据库插入'井下设备' :    insert into Static_Bel ...

  9. 处理mysql上百万条数据的优化

    php 处理上百万条的数据库如何提高处理查询速度 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字 ...

  10. 【数论】Miller_Rabin

    Miller_Rabin素数测试     Miller_Rabin判断单个素数的方法运用了费马小定理,可以说非常之快了.     Miller_Rabin曾经被称作“黑科技”,但是根据费马小定理其实完 ...