亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 45558 | 回復: 0
打印 上一主題 下一主題

MySQL浮點計算存在的問題與解決方案 [復制鏈接]

論壇徽章:
2
數(shù)據(jù)庫技術版塊每日發(fā)帖之星
日期:2016-03-10 06:20:00數(shù)據(jù)庫技術版塊每日發(fā)帖之星
日期:2016-06-23 06:20:00
跳轉到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2016-06-20 15:47 |只看該作者 |倒序瀏覽

如有疑問請聯(lián)系微信:onesoft007 

     在計算機中,浮點數(shù)往往很難精確表示,那么浮點數(shù)運算結果也往往難以精確表示。MySQL同樣也存在這個問題,并表現(xiàn)在如下幾個方面。

問題

1、相同的輸入,可能造成不一樣的輸出(受CPU、編譯器等影響) 

  a)下面是MySQL官方網(wǎng)站給出的例子

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、結果受浮點數(shù)本身的精確度影響
  把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中,帶有小數(shù)的精確運算可以使用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、基于應用的解決方案
  比如商品價格涉及到小數(shù),用20.95元表示,那么可以把價格變成以分為單位,即變成2095。

結論
  不要使用float、double以及其等價類型做精確計算。如果要在MySQL中做精確計算,推薦使用decimal或者將相關計算任務交給應用。
如有疑問請聯(lián)系微信:onesoft007
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復

  

北京盛拓優(yōu)訊信息技術有限公司. 版權所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關心和支持過ChinaUnix的朋友們 轉載本站內容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP