繁体   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