SQL Round函数

时间:2009-07-10 10:06:41

标签: sql rounding

round(45.923,-1)给出50的结果。为什么会这样?如何计算?

(对不起,伙计们我错误地提到这个问题的早期版本,表明价值是46)

7 个答案:

答案 0 :(得分:12)

SQL ROUND()函数将数字四舍五入为精度...

例如:

round(45.65,1)给出结果= 45.7

round(45.65,-1)给出结果= 50

因为这种情况下的精度是从小数点计算的。如果为正,那么它将考虑右侧数字并且如果它> = 5则向上舍入,并且如果< = 4则圆形向下...并且类似地如果它是负的则则计算左侧的精度小数点...如果它是> = 5

例如round(44.65,-1)给出40 但是圆形(45.65,-1)给出50 ......

答案 1 :(得分:4)

ROUND(748.58,-1)750.00

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

From

答案 2 :(得分:2)

预计为50岁。

round(45.923,0)=> 46

expl:最后一个非十进制数字舍入(5),该决定基于下一个数字(9) 9是在高半部分,ergo 5是向上舍入到6

round(45.923,1)=> 45.9

expl:第一个十进制数字是舍入的(9),desicion是基于下一个数字(2) 2是在低半,ergo 9保持9

您的情况: 圆形(45.923,1-)=> 45.92

expl:secon-last非十进制数字舍入(4),desicion基于下一个数字(5) 5是在上半部分,ergo 4是向上舍入到5,其余的挖掘者都是0s

答案 3 :(得分:2)

至于如何,首先考虑如何将(正)浮点数舍入到最接近的整数。将浮点数转换为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与基数2中的0x1234 / 2**30x1234 * 2**-3相同。在基数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);
}

答案 4 :(得分:1)

在MySQL上不适合我:

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

答案 5 :(得分:0)

在Sql Server 2005上:

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

您在运行此数据库的哪个数据库?

答案 6 :(得分: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