[英]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 >> 3
與0x1234 / 2**3
和0x1234 * 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.