7

round(45.923,-1)结果为 50。这是为什么呢?它是如何计算的?

(对不起,我误认为这个问题的早期版本表明价值是 46)

4

7 回答 7

14

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...

于 2009-07-10T10:25:51.253 回答
4

回合(748.58,-1)750.00

第二个参数:Lenght,是 numeric_expression 要四舍五入的精度。length 必须是 tinyint、smallint 或 int 类型的表达式。当length 为正数时,numeric_expression 被四舍五入为length 指定的小数位数。当长度为负数时,numeric_expression 在小数点左侧四舍五入,由长度指定。

于 2009-07-10T10:11:49.363 回答
2

预计为50。

回合(45.923,0)=> 46

expl:最后一个非小数位四舍五入(5),决定基于下一个数字(9)9在高半部分,所以5四舍五入到6

回合(45.923, 1)=> 45.9

expl:第一个十进制数字四舍五入(9),决定基于下一个数字(2)2在低半部分,所以9保持9

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

expl:倒数第二个非十进制数字四舍五入(4),决定基于下一个数字(5)5在上半部分,ergo 4四舍五入到5,其余的digist填充0s

于 2009-07-10T10:49:42.237 回答
2

至于如何,首先考虑如何将(正)浮点数舍入到最接近的整数。将浮点数转换为 int 会截断它。当我们想要四舍五入时(当小数部分 >= 0.5)时,将 0.5 添加到(正)浮点数将精确地增加整数部分。这给出了以下内容:

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

要添加对精度参数的支持,请注意(例如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);
}
于 2009-07-10T12:43:19.410 回答
0

它不适合我在 MySQL 上:

mysql> select round(45.923,-1);
+------------------+
| round(45.923,-1) |
+------------------+
|               50 |
+------------------+
1 row in set (0.00 sec)
于 2009-07-10T10:09:16.543 回答
0

在 Sql Server 2005 上:

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

你在什么数据库上运行这个?

于 2009-07-10T10:11:29.333 回答
0

有一件事是在轮函数中,第一个参数是数字,第二个参数是小数侧的精度指数。

这意味着如果精度索引为 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
于 2020-09-09T11:23:10.047 回答