SQL Round函数

问题描述 投票:4回答:6

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

(对不起,伙计们,我误解了这个问题的早期版本,暗示价值是46)

sql rounding
6个回答
12
投票

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

例如:

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

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

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

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


4
投票

ROUND(748.58,-1)750.00

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

From


2
投票

预计为50。

圆(45.923,0)=> 46

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

圆(45.923,1)=> 45.9

expl:第一个十进制数字是舍入的(9),决定是基于下一个数字(2)2是在下半部分,ergo 9是9

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

expl:secon-last非十进制数字舍入(4),决定基于下一个数字(5)5是在上半部分,ergo 4是向上舍入到5,其余数字是用0


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);
}

1
投票

在MySQL上它不适合我:

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

0
投票

在Sql Server 2005上:

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

您在运行此数据库的数据库是什么?

© www.soinside.com 2019 - 2024. All rights reserved.