最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2018年06月25日 11:59:24   作者:Joker_Ye  
這篇文章主要介紹了MySQL中ROUND函數(shù)進行四舍五入操作陷阱,結(jié)合實例形式分析了mysql使用ROUND函數(shù)進行四舍五入運算中出現(xiàn)的問題及其錯誤原因,需要的朋友可以參考下

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

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

問題描述

假如我們有如下一個數(shù)據(jù)表 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;

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

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

插入之后表中的數(shù)據(jù)是這樣的

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)

如果現(xiàn)在我們執(zhí)行下面這個SQL,你覺得結(jié)果會是什么樣的呢?

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;

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

*************************** 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,為什么從數(shù)據(jù)庫中的字段相乘得到的結(jié)果和直接字段與小數(shù)相乘得到的不一樣呢?

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

  • For exact-value numbers, ROUND() uses the “round half up” rule對于精確的數(shù)值, ROUND 函數(shù)使用四舍五入
  • 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函數(shù)庫,在很多系統(tǒng)中 ROUND 函數(shù)會使用“取最近的偶數(shù)”的規(guī)則)

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

總結(jié)

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

更多關(guān)于MySQL相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《MySQL查詢技巧大全》、《MySQL事務(wù)操作技巧匯總》、《MySQL存儲過程技巧大全》、《MySQL數(shù)據(jù)庫鎖相關(guān)技巧匯總》及《MySQL常用函數(shù)大匯總

希望本文所述對大家MySQL數(shù)據(jù)庫計有所幫助。

相關(guān)文章

  • mysql連接查詢中and與where的區(qū)別淺析

    mysql連接查詢中and與where的區(qū)別淺析

    在使用數(shù)據(jù)庫查詢語句時,單表的查詢有時候不能滿足項目的業(yè)務(wù)需求,在項目開發(fā)過程中,有很多需求都是要涉及到多表的連接查詢,這篇文章主要給大家介紹了關(guān)于mysql連接查詢中and與where區(qū)別的相關(guān)資料,需要的朋友可以參考下
    2021-07-07
  • MySQL InnoDB存儲引擎的深入探秘

    MySQL InnoDB存儲引擎的深入探秘

    這篇文章主要給大家介紹了關(guān)于MySQL InnoDB存儲引擎的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面來一起學習學習吧
    2019-02-02
  • MySQL query_cache_type 參數(shù)與使用詳解

    MySQL query_cache_type 參數(shù)與使用詳解

    這篇文章主要介紹了MySQL query_cache_type參數(shù)介紹,需要的朋友可以參考下
    2021-07-07
  • 超詳細MySQL8.0.22安裝及配置教程

    超詳細MySQL8.0.22安裝及配置教程

    這篇文章主要介紹了超詳細MySQL8.0.22安裝及配置教程,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-12-12
  • 一起來了解mysql數(shù)據(jù)庫

    一起來了解mysql數(shù)據(jù)庫

    大家好,本篇文章主要講的是一起來了解mysql數(shù)據(jù)庫,感興趣的同學趕快來看一看吧,對你有幫助的話記得收藏一下,方便下次瀏覽
    2021-12-12
  • Windows中MySQL root用戶忘記密碼解決方案

    Windows中MySQL root用戶忘記密碼解決方案

    在實際應(yīng)用中,經(jīng)常會出現(xiàn)忘記mysql管理員用戶root的密碼的情況出現(xiàn),那么我們?nèi)绾蝸碓O(shè)置一個新密碼從而登錄數(shù)據(jù)庫呢,下面我們來探討下
    2014-07-07
  • 如何設(shè)計高效合理的MySQL查詢語句

    如何設(shè)計高效合理的MySQL查詢語句

    合理的MySQL查詢語句可以讓我們的MySQL數(shù)據(jù)庫效率更高,那么如何設(shè)計高效合理的查詢語句就成為了擺在我們面前的問題。
    2015-08-08
  • MySQL常見問題解決辦法以及自動化安裝腳本

    MySQL常見問題解決辦法以及自動化安裝腳本

    自動化運維是一個DBA應(yīng)該掌握的技術(shù),其中,自動化安裝數(shù)據(jù)庫是一項基本的技能,下面這篇文章主要給大家介紹了關(guān)于MySQL常見問題解決辦法以及自動化安裝腳本的相關(guān)資料,需要的朋友可以參考下
    2024-05-05
  • MySQL中的連接查詢(等值連接)

    MySQL中的連接查詢(等值連接)

    這篇文章主要介紹了MySQL中的連接查詢(等值連接),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-07-07
  • Mysql定時數(shù)據(jù)庫備份實現(xiàn)的保姆級教程

    Mysql定時數(shù)據(jù)庫備份實現(xiàn)的保姆級教程

    數(shù)據(jù)備份本身主要是為了預(yù)防一些意外,例如服務(wù)器或者個人電腦的硬件故障、人為的錯誤操作等情況,這篇文章主要給大家介紹了Mysql定時數(shù)據(jù)庫備份實現(xiàn)的保姆級教程,需要的朋友可以參考下
    2024-12-12

最新評論

滨海县| 柳林县| 柘荣县| 绵阳市| 壶关县| 九江市| 牟定县| 庆元县| 苍南县| 永城市| 临沂市| 白水县| 富源县| 江津市| 博罗县| 华容县| 玉林市| 当阳市| 池州市| 绥中县| 乐东| 历史| 岑巩县| 岑溪市| 丽水市| 舞阳县| 明光市| 靖西县| 昌图县| 黑山县| 宜兴市| 泸州市| 南安市| 丽水市| 甘肃省| 繁昌县| 永仁县| 嘉禾县| 保山市| 五指山市| 靖西县|