簡體   English   中英

SQL 輪函數

[英]SQL Round Function

round(45.923,-1)給出了 50 的結果。這是為什么? 它是如何計算的?

(對不起,我誤認為這個問題的早期版本建議值為 46)

SQL ROUND() 函數將數字四舍五入到精度...

例如:

round(45.65, 1) 給出結果 = 45.7

round(45.65, -1) 給出結果 = 50

因為這種情況下的精度是從小數點開始計算的。 如果是正數,那么它會考慮右邊的數字,如果 >= 5,則將其向上舍入,如果 <=4,則向下舍入......同樣,如果它是負數,則計算小數點左側的精度點...如果它 >= 5

例如 round(44.65, -1) 給出 40 但 round(45.65, -1) 給出 50 ...

回合 (748.58, -1) 750.00

第二個參數:長度,是 numeric_expression 的四舍五入精度。 length 必須是 tinyint、smallint 或 int 類型的表達式。 當 length 為正數時,numeric_expression 將四舍五入為 length 指定的小數位數。 當長度為負數時,numeric_expression 在小數點左側四舍五入,如長度所指定。

預計為50。

回合(45.923,0)=> 46

expl:最后一個非十進制數字四舍五入(5),desicion基於下一個數字(9)9在高半,ergo 5四舍五入到6

回合(45.923,1)=> 45.9

expl:第一個十進制數字四舍五入(9),desicion基於下一個數字(2)2在下半部分,ergo 9保持9

你的情況: round(45.923, 1-) => 45.92

expl:倒數第二個非十進制數字四舍五入(4),desicion基於下一個數字(5)5在上半部分,ergo 4四舍五入為5,其余數字填充0秒

至於如何,首先考慮如何將(正)浮點數四舍五入到最接近的整數。 將浮點數轉換為 int 會截斷它。 當我們想要四舍五入時(當小數部分 >= 0.5 時),將 0.5 添加到(正)浮點數將精確地增加整數部分。 這給出了以下內容:

double round(double x) {
    return (long long)(x + 0.5);
}

要添加對 precision 參數的支持,請注意(例如round(123456.789, -3) )添加 500 並截斷千位基本上與添加 0.5 並四舍五入到最接近的整數相同,只是小數點處於不同的位置。 要四處移動小數點,我們需要向左和向右移動操作,這相當於乘以提高到移動量的基數。 0x1234 >> 30x1234 / 2**30x1234 * 2**-3在基數 2 中相同。 在基數 10 中:

123456.789 >> 3 == 123456.789 / 10**3 == 123456.789 * 10**-3 == 123.456789

對於round(123456.789, -3) ,這意味着我們可以進行上述乘法以移動小數點,加 0.5,截斷,然后執行相反的乘法以將小數點移回。

double round(double x, double p) {
    return ((long long)((x * pow10(p))) + 0.5) * pow10(-p);
}

通過添加 0.5 和截斷對非負數進行四舍五入適用於非負數,但對於負數則以錯誤的方式四舍五入。 有幾種解決方案。 如果您有一個高效的sign()函數(返回 -1、0 或 1,分別取決於數字是 <0、==0 還是 >0),您可以:

double round(double x, double p) {
    return ((long long)((x * pow10(p))) + sign(x) * 0.5) * pow10(-p);
}

如果沒有,還有:

double round(double x, double p) {
    if (x<0) 
      return - round(-x, p);
    return ((long long)((x * pow10(p))) + 0.5) * pow10(-p);
}

它不適合我在 MySQL 上:

mysql> select round(45.923,-1);
+------------------+
| round(45.923,-1) |
+------------------+
|               50 |
+------------------+
1 row in set (0.00 sec)

在 Sql Server 2005 上:

select round(45.923,-1)
------
50.000

你在什么數據庫上運行這個?

一件事是在 round 函數中,第一個參數是數字,第二個參數是小數側的精度索引。

這意味着如果精度指數為 0 則為第一個小數點,-1 表示小數點前的第一個數字,1 表示第一個小數點的右側,即第二個小數點

例如

round(111.21,0)---------> return 111
round(115.21,-1)--------->return 120
round(111.325,2)---------->return 111.33
round(111.634,1)-----------> return 111.6

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM