一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數據庫技術|

服務器之家 - 數據庫 - Mysql - MySQL中ROUND函數進行四舍五入操作陷阱分析

MySQL中ROUND函數進行四舍五入操作陷阱分析

2019-07-08 11:36Joker_Ye Mysql

這篇文章主要介紹了MySQL中ROUND函數進行四舍五入操作陷阱,結合實例形式分析了mysql使用ROUND函數進行四舍五入運算中出現的問題及其錯誤原因,需要的朋友可以參考下

本文實例講述了MySQL中ROUND函數進行四舍五入操作陷阱。分享給大家供大家參考,具體如下:

在MySQL中, ROUND 函數用于對查詢結果進行四舍五入,不過最近使用ROUND函數四舍五入時意外發現并沒有預期的那樣,本文將這一問題記錄下來,以免大家跟我一樣犯同樣的錯誤。

問題描述

假如我們有如下一個數據表 test ,建表語句如下

CREATE TABLE test (
 id int(11) NOT NULL AUTO_INCREMENT,
 field1 bigint(10) DEFAULT NULL,
 field2 decimal(10,0) DEFAULT NULL,
 field3 int(10) DEFAULT NULL,
 field4 float(15,4) DEFAULT NULL,
 field5 float(15,4) DEFAULT NULL,
 field6 float(15,4) DEFAULT NULL,
 PRIMARY KEY (id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

我們創建了一個名為 test 的表,出了 id 字段之外還包含了多個字段,擁有這不同的數據類型。我們向這個表中插入一條數據

INSERT INTO test (field1, field2, field3, field4, field5, field6) VALUE (100, 100, 100, 1.005, 3.5, 2.5);

插入之后表中的數據是這樣的

mysql> select * from test;
+----+--------+--------+--------+--------+--------+--------+
| id | field1 | field2 | field3 | field4 | field5 | field6 |
+----+--------+--------+--------+--------+--------+--------+
| 1 |  100 |  100 |  100 | 1.0050 | 3.5000 | 2.5000 |
+----+--------+--------+--------+--------+--------+--------+
1 rowin set (0.00 sec)

如果現在我們執行下面這個SQL,你覺得結果會是什么樣的呢?

SELECT
 round(field1 * field4),
 round(field2 * field4),
 round(field3 * field4),
 round(field1 * 1.005),
 round(field2 * 1.005),
 round(field3 * 1.005),
 round(field5),
 round(field6)
FROM test;

最初一直以為這樣的結果肯定是都是 101 ,因為上面這六個取值結果都是對 100 * 1.005 進行四舍五入,結果肯定都是 101 才對,而后面兩個肯定是 4 和 3 才對,但是最終的結果卻是與設想的大相徑庭

*************************** 1. row ***************************
round(field1 * field4): 100
round(field2 * field4): 100
round(field3 * field4): 100
 round(field1 * 1.005): 101
 round(field2 * 1.005): 101
 round(field3 * 1.005): 101
    round(field5): 4
    round(field6): 2
1 rowin set (0.00 sec)

為什么會這樣?

同樣是100*1.005,為什么從數據庫中的字段相乘得到的結果和直接字段與小數相乘得到的不一樣呢?

對這個問題百思不得其解,各種百度谷歌無果。。。沒辦法,還得靠自己,這個時候最有用的就是官網文檔了,于是查詢了mysql官方文檔中關于ROUND函數的部分,其中包含下面兩條規則

  • For exact-value numbers, ROUND() uses the “round half up” rule對于精確的數值, ROUND 函數使用四舍五入
  • For approximate-value numbers, the result depends on the C library. On many systems, this means that ROUND() uses the “round to nearest even” rule: A value with any fractional part is rounded to the nearest even integer. (對于近似值,則依賴于底層的C函數庫,在很多系統中 ROUND 函數會使用“取最近的偶數”的規則)

通過這兩條規則,我們可以看出,由于我們在使用兩個字段相乘的時候,最終的結果是按照 float 類型處理的,而在計算機中 float 類型不是精確的數,因此處理結果會按照第二條來,而直接整數字段與1.005這樣的小數運算的結果是因為兩個參與運算的值都是精確數,因此按照第一條規則計算。從 field5 和 field6 執行 ROUND 函數的結果可以明確的看確實是轉換為了最近的偶數。

總結

從這個例子中可以看到,在MySQL中使用ROUND還是要非常需要注意的,特別是當參與計算的字段中包含浮點數的時候,這個時候計算結果是不準確的。

希望本文所述對大家MySQL數據庫計有所幫助。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 日本不卡免免费观看 | 久久青青草原综合伊人 | 国产精品欧美亚洲韩国日本99 | 亚洲 日本 天堂 国产 在线 | 深夜福利在线播放 | 糖心在线观看网 | 日韩成a人片在线观看日本 日韩不卡一区二区 | 国产精品日韩欧美一区二区 | 欧美军人男同69gay | 美女逼逼喷水 | 欧美在线播放一区二区 | 1313午夜精品久久午夜片 | 视频一区 日韩 | 女人把私密部位张开让男人桶 | 成人国产精品一级毛片视频 | 视频大全在线观看网址 | 免费看视频网站 | 日本一区免费观看 | 双性总裁(h) | 青草视频在线观看免费视频 | 麻豆天美精东果冻传媒在线 | gogort人体的最新网站 | 日本高清视频网站www | 四虎国产精品免费入口 | 亚洲人成在线播放 | 日韩精品一区二区 | 天天色天天综合网 | 精品久久久久久综合网 | 美女班主任下面好爽好湿好紧 | 青草视频在线观看免费资源 | chinese男gay飞机同志 | 国产亚洲精品一区在线播 | 国内精品久久久久久久久 | 都市后宫小说 | 69天堂网| 黄动漫软件车车好快的车车 | 色老汉| 草草草视频在线观看 | 国自产在线精品免费 | 国产精品合集久久久久青苹果 | 丰腴尤物贵妇浪荡小说 |