日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2023/12/15 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 FLOAT或DOUBLE列与具有数值类型的数值进行比较 问题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

來源:


首先聲明: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列与具有数值类型的数值进行比较 问题的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。