round(45.923,-1)
给出50的结果。为什么会这样?如何计算?
(对不起,伙计们我错误地提到这个问题的早期版本,表明价值是46)
答案 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在小数点左侧舍入,由长度指定。
答案 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**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);
}
答案 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