round(45.923,-1)
给出50的结果。这是为什么?如何计算?
(对不起,伙计们,我误解了这个问题的早期版本,暗示价值是46)
SQL ROUND()函数将数字四舍五入为精度...
例如:
round(45.65,1)给出结果= 45.7
round(45.65,-1)给出结果= 50
因为这种情况下的精度是从小数点计算的。如果为正,则它将考虑右侧数字并且如果它> = 5则向上舍入,并且如果<= 4则圆形向下...并且类似地如果它是负的则则计算小数的左侧的精度点......如果它> = 5
例如圆形(44.65,-1)给出40但圆形(45.65,-1)给出50 ...
ROUND(748.58,-1)750.00
第二个参数:Lenght,是numeric_expression要舍入的精度。 length必须是tinyint,smallint或int类型的表达式。当length为正数时,numeric_expression将四舍五入为length指定的小数位数。当length为负数时,numeric_expression在小数点的左侧舍入,由length指定。
预计为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
至于如何,首先考虑如何将(正)浮点数舍入到最接近的整数。将浮点数转换为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**3
和0x1234 * 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);
}
在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
您在运行此数据库的数据库是什么?