FLOAT或DOUBLE列与具有数值类型的数值进行比较 问题
來源:
首先聲明:Mysql手冊上已經(jīng)說明,FLOAT或DOUBLE列與具有數(shù)值類型的數(shù)值進行比較,不能使用等式(=)比較.
但實際還有這種需要.
今天就來研究一下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進制之間的誤差.看樣子誤差也在第七位出現(xiàn)了.所以小數(shù)據(jù)保留七位或是八位是有依據(jù)的.
在大多數(shù)計算機語言中,該問題很常見,這是因為,并非所有的浮點值均能以準確的精度保存。在某些情況下,將FLOAT更改為DOUBLE可更正該問題。
解決方法:
第一個是用區(qū)間:
select * from olympic_result where result>10.27 and result<10.29;
第二個就是在設(shè)計根本不設(shè)計float型的字段,而是用一個int型+標識這個int型的小數(shù)位來代替float型,也就是result=10.28在數(shù)據(jù)庫中存的是result=10.28,precision=2
缺點:但這種方法,排序時,不好解決.
第三個方法:設(shè)計時多做一個字符字段:
如: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進行.
思考:
如果小數(shù)點后面位數(shù)固定可以用decimal類型.也可以解決問題.
總結(jié)
以上是生活随笔為你收集整理的FLOAT或DOUBLE列与具有数值类型的数值进行比较 问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: “元宇宙第一股”Roblox 2022
- 下一篇: 沙特将把首位女宇航员送入太空:上次还是3