来源:

首先声明:Mysql手册上已经说明,FLOAT或DOUBLE列与具有数值类型的数值进行比较,不能使用等式(=)比较.

但实际还有这种需要.

今天就来研究一下float,double 字段在where 字段中的处理.
>desc olympic_result;
+---------+------------------+------+-----+---------+----------------+
| Field   | Type             | Null | Key | Default | Extra          |
+---------+------------------+------+-----+---------+----------------+
| id      | int(10) unsigned |      | PRI | NULL    | auto_increment |
| user_id | int(10) unsigned |      |     | 0       |                |
| types   | tinyint(4)       |      |     | 0       |                |
| result  | float            |      | MUL | 0       |                |
| times   | int(10) unsigned |      |     | 0       |                |
+---------+------------------+------+-----+---------+----------------+
> select * from olympic_result;
+----+---------+-------+--------+-----------+
| id | user_id | types | result | times     |
+----+---------+-------+--------+-----------+
|  1 |     243 |     1 |  10.28 | 143243242 |
+----+---------+-------+--------+-----------+
> select * from olympic_result where result=10.28;  
Empty set (0.00 sec)
>Why?

让我们看一下:
>alter table olympic_result add cresutl varchar(32);
>update olympic_result set cresult=10.28 where id=1;
mysql> select * from olympic_result;
+----+---------+-------+--------+-----------+-------------------------+
| id | user_id | types | result | times     | cresult                 |
+----+---------+-------+--------+-----------+-------------------------+
|  1 |     243 |     1 |  10.28 | 143243242 | 10.27999973297119140625 |
可以看到10.28,这样的浮点值在电脑存放为10.27999973297119140625 这种形式.
听高手讲是:因为10进制和2进制之间的误差.看样子误差也在第七位出现了.所以小数据保留七位或是八位是有依据的.
在大多数计算机语言中,该问题很常见,这是因为,并非所有的浮点值均能以准确的精度保存。在某些情况下,将FLOAT更改为DOUBLE可更正该问题。

解决方法:
第一个是用区间:
select * from olympic_result where result>10.27 and result<10.29;
第二个就是在设计根本不设计float型的字段,而是用一个int型+标识这个int型的小数位来代替float型,也就是result=10.28在数据库中存的是result=10.28,precision=2
缺点:但这种方法,排序时,不好解决.
第三个方法:设计时多做一个字符字段:
如:alter table olympic_result add cresutl varchar(32);
插入更新时,加上引号.
>update olympic_result set cresult='10.28' where id=1;
这样去处理.
查询:
mysql> select * from olympic_result where cresult='10.28';
+----+---------+-------+--------+-----------+---------+
| id | user_id | types | result | times     | cresult |
+----+---------+-------+--------+-----------+---------+
|  1 |     243 |     1 |  10.28 | 143243242 | 10.28   |
+----+---------+-------+--------+-----------+---------+

排序时可以按result进行.

思考:
如果小数点后面位数固定可以用decimal类型.也可以解决问题.

FLOAT或DOUBLE列与具有数值类型的数值进行比较 问题相关推荐

  1. MySQL FLOAT、DOUBLE、DECIMAL(小数类型)

    MySQL 中使用浮点数和定点数来表示小数. 浮点类型有两种,分别是单精度浮点数(FLOAT)和双精度浮点数(DOUBLE):定点类型只有一种,就是 DECIMAL. 浮点类型和定点类型都可以用(M, ...

  2. python数值类型_Python数值类型

    python数值类型 In programming, Data Types are an essential concept. Data of various types can be stored ...

  3. float与double的精度问题

    [问题] 在之前的一篇文章中,提到过float和double不能用于金额计算,原因是浮点型数据计算中会产生误差,造成结果不准确.这一篇我们仔细分析这种误差的产生来源. 先看一段代码: public s ...

  4. mysql:列类型之float、double

    环境: window10 vs2022 .net 6 mysql 8.0.25 DBeaver 参考: <MSDN:浮点数值类型(C# 引用)> <mysql:11.1.4 Floa ...

  5. Mysql数值类型之float,double,decimal

    对于小数的表示,MySQL分为两种方式:浮点数和定点数.浮点数包括float(单精度),double(双精度),而定点数只有decimal一种表示.定点数在MySQL内部以字符串的形式存放,比浮点数更 ...

  6. MySQL列类型之——数值类型

    如想进一步了解有关mysql的信息请点击http://dev.mysql.com/doc/refman/5.1/zh/column-types.html MySQL支持多种列类型:数值类型.日期/时间 ...

  7. 20141230 mysql数值类型和列属性一

    20141230 mysql数值类型和列属性一 回顾 数据库基础知识,关系型数据库(行/记录,列/字段,SQL) 基本SQL操作:库操作,表操作(字段)和数据操作 字符集 校对集 1. 什么是校对集? ...

  8. mysql float 转换 int_Mysql 数值类型(int,float,tinyint.......)[转]

    首先说一下mysql的数值类型,MySQL支持所有标准SQL数值数据类型.这些类型包括严格数值数据类型(INTEGER.SMALLINT.DECIMAL和NUMERIC),以及近似数值数据类型(FLO ...

  9. java中float和double型数据在赋值时有哪些注意事项?,java语言中float和double类型的数据在编程时的注意事项...

    float和double类型的数据在编程时的需要注意的地方 package execisetest; public class AccuranceTest {     public static vo ...

最新文章

  1. CMake结合PCL库学习(2)
  2. 图像传感器与信号处理——详解图像传感器噪声
  3. 如何节约数据中心空间
  4. 使用maven聚合安装多个maven工程到本地仓库报错的解决方法:child module pom.xml does not exist
  5. vim学习笔记(3)眼花缭乱的Vim模式
  6. 7-3 银行排队问题之单队列多窗口服务 (25 分)
  7. C++ opengl 学习笔记-在OpenGL入门级代码里面glLoadIdentity的理解
  8. PL/SQL第三课(学习笔记)
  9. 第十二篇 Android 系统电话管理机制一--工厂模式和代理模式
  10. 【CCCC】L2-017 人以群分 (25分),,模拟水题
  11. 服务器刷课源码,国开刷课
  12. 十八、D触发器介绍:
  13. 微信播放在服务器视频无法播放,微信收藏的视频不能播放怎么办?怎么收藏视频?...
  14. win10 桌面右键菜单内容修改
  15. 2018中科院计算所夏令营面试经历
  16. 二、页面构成与色彩搭配
  17. html中把图片移动位置不变,css如何定位图片保持位置不变?
  18. 如何提升自己的硬实力
  19. ios 自架验证服务器,iOS 13-Sign In with Apple(苹果登录)APP+后端验证
  20. 普教同步课堂、专递课堂建设解决方案

热门文章

  1. 深入理解JavaScript闭包(closure) 【收藏】
  2. 几个.net开发中常用的工具下载
  3. 操作excel的一些方法
  4. iOS之AVPlayerViewController的使用oc
  5. matlab 倒数第二个位置_MATLAB中运行以下程序后倒数第二部分画图程序要怎么改??、、、...
  6. 一个mapper接口有多个mapper.xml 文件_爱了!分享一个基于Spring Boot的API、RESTful API项目种子(骨架)!...
  7. 微服务的好处与弊端_在云原生时代,就一定要用微服务吗?
  8. 计算机科学与教育信息化国际会议,A Courses Ontology System for Computer Science Education...
  9. jpane1_Java—面板组件(Jpanel)1
  10. 嵌入式linux+io+优化,嵌入式Linux系统内存优化使用方法研究