SQL轮函数

SQL轮函数,sql,rounding,Sql,Rounding,四舍五入(45.923,-1)给出50的结果。为什么会这样?如何计算 (抱歉,伙计们,我被这个问题的早期版本弄错了,它的值是46)我在MySQL上没有: mysql> select round(45.923,-1); +------------------+ | round(45.923,-1) | +------------------+ | 50 | +------------------+ 1 row in set (0.00 sec) 在Sql Ser

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


(抱歉,伙计们,我被这个问题的早期版本弄错了,它的值是46)

我在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
您在哪个数据库上运行此操作?

轮(748.58,-1)750.00

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

SQL ROUND()函数将数字舍入到某个精度

例如:

四舍五入(45.65,1)得出的结果为45.7

四舍五入(45.65,-1)得出的结果为50

因为这种情况下的精度是从小数点开始计算的。如果是正的,它将考虑右边数,如果它是>5,则将它向上圆,如果I= 5

例如,圆形(44.65,-1)表示40
但是第四轮(45.65,-1)给出了50…

预计是50

圆形(45.923,0)=>46

解释:最后一个非十进制数字四舍五入(5),决定基于下一个数字(9) 9在高半部,因此5被四舍五入到6

圆形(45.923,1)=>45.9

解释:第一个十进制数字四舍五入(9),决定基于下一个数字(2) 2在下半部分,因此9保持在9

您的案例: 圆形(45.923,1-)=>45.92

解释:第二个非十进制数字四舍五入(4),决定基于下一个数字(5)
5在上半部分,因此4向上舍入为5,数字列表的其余部分填充0。至于如何舍入,首先考虑如何将(正)浮点舍入为最接近的整数。将浮点值强制转换为整数会截断它。将0.5添加到(正)浮点将在我们想要向上取整时精确地增加整数部分(当小数部分>=0.5时)。这就产生了以下结果:

double round(double x) {
    return (long long)(x + 0.5);
}
要添加对precision参数的支持,请注意(例如,
舍入(123456.789,-3)
)加500并在千位截断基本上与加0.5相同,要舍入到最接近的整数,小数点位于不同的位置。要移动基点,我们需要左移位和右移位操作,这相当于将基数乘以移位量。也就是说,
0x1234>>3
与基2中的
0x1234/2**3
0x1234*2**-3
相同。在基数10中:

123456.789 >> 3 == 123456.789 / 10**3 == 123456.789 * 10**-3 == 123.456789
对于
四舍五入(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),您可以:

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);
}
双圆(双x,双p){

如果(x一件事在四舍五入函数中,第一个参数是数字,第二个参数是从小数侧开始的精度指数

这意味着,如果精度指数为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

在MySQL 5.0.67-0ubuntu6上它给出了50,如-你在使用什么?伙计…我知道这是为什么?它是如何计算的也许关于你试图做什么的更多信息是有序的?这本身是不正确的信息。在你的问题回合(45.923,-1)将产生50..然而回合(44.923,-1)将屈服于40。同样的轮(45.923,-2)将屈服于。00你说“它不会”但是,这与OP的结果完全相同。这个答案似乎与公认的答案非常相似;你想在OP中强调什么不同的地方吗?如果没有,最好投票支持已经存在的答案,或者在可能受益于额外上下文的答案上加上评论。