[英]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.