Mysql-半向下或半向上取整

Mysql-半向下或半向上取整,mysql,rounding,Mysql,Rounding,有没有办法指定在使用MySql的sql查询中,是否要将字段值4.485四舍五入到4.48(半向下)或4.49(半向上) 感谢使用mysqlROUND() 这篇文章的公认答案提供了一个很好的解决方案: i、 e乘以10^n,其中n是要四舍五入的小数位,然后调用ceil进行四舍五入或floor进行四舍五入并除以10^n。您可以使用ceil(或天花板)和floor函数进行四舍五入/四舍五入 例如: CEIL(4.485 * 100) / 100 will return 4.49 FLOOR(4.48

有没有办法指定在使用MySql的sql查询中,是否要将字段值4.485四舍五入到4.48(半向下)或4.49(半向上)

感谢使用mysql
ROUND()


这篇文章的公认答案提供了一个很好的解决方案:

i、 e乘以10^n,其中n是要四舍五入的小数位,然后调用
ceil
进行四舍五入或
floor
进行四舍五入并除以10^n。

您可以使用ceil(或天花板)和floor函数进行四舍五入/四舍五入

例如:

CEIL(4.485 * 100) / 100 will return 4.49
FLOOR(4.485 * 100) / 100 will return 4.48

即使这个问题已经多年了,我也遇到了同样的问题,并找到了一个不同的解决方案,我想与大家分享

这里是:使用一个条件函数,当最后一个小数点为5时,您可以显式地决定要采用哪种方式进行四舍五入。 例如,如果您想用2位小数取整一半:

SELECT IF ((TRUNCATE(mynumber*1000,0) mod 5) = 0,CEIL(mynumber*100)/100,ROUND(mynumber,2)) as value FROM mytable
如果你想取整一半,你可以使用地板功能代替天花板;如果需要不同数量的小数,比如n,则在TRUNCATE调用中更改乘法器(10^n+1),然后将其传递给ROUND函数

SELECT IF ((TRUNCATE(mynumber*([10^*n+1*]),0) mod 5) = 0,[CEIL|FLOOR](mynumber*100)/100,ROUND(mynumber,[*n*])) as value FROM mytable
根据,

  • 对于精确值数字,ROUND()使用“向上取整一半”规则

我也有过这样一种情况,我想知道为什么Mysql会将(1)74447四舍五入到74,4。这是因为它实际上是一个无限长的小数,一个近似值,而不是一个精确值。我的解决方案是,我必须使用
ROUND()
3x,如下所示:
ROUND(ROUND(ROUND(value,3),2),1)
。第一次舍入确保它不再是一个近似值数字(Mysql使用“舍入到最接近的偶数”规则),而是一个精确值数字,一个十进制3数字。

我有同样的疑问,我尝试各种自定义函数来模拟PHP的上下舍入功能,但过了一会儿,我发现MySQL使用float和double字段生成不同的结果

这是我的测试

mysql> describe test_redondeo;
+----------------+--------------+------+-----+---------+-------+
| Field          | Type         | Null | Key | Default | Extra |
+----------------+--------------+------+-----+---------+-------+
| columna_double | double(15,3) | YES  |     | NULL    |       |
| columna_float  | float(9,3)   | YES  |     | NULL    |       |
| id             | int(11)      | NO   | PRI | NULL    |       |
+----------------+--------------+------+-----+---------+-------+
3 rows in set (0.01 sec)
在字段类型double中,舍入函数截断,但在float-round-up中

mysql> select columna_double, columna_float, round ( columna_double, 2) as round_double, round ( columna_float, 2) as round_float from test_redondeo;
+----------------+---------------+--------------+-------------+
| columna_double | columna_float | round_double | round_float |
+----------------+---------------+--------------+-------------+
|        902.025 |       902.025 |       902.02 |      902.03 |
+----------------+---------------+--------------+-------------+
1 row in set (0.00 sec)
如果您以任何方式使用round()对数字进行四舍五入的自定义函数,请注意字段的类型


希望这项测试对您有所帮助。

这将使每次四舍五入。考虑到小数位数的目标值,4.485总是四舍五入到4.48。总是。这就是舍入的工作原理。4.485到4.48是。可能在mysql中总是向上取整,但在PHP中,例如,它可以是definedit,这是正确的,但问题是,如果可以定义mysql行为,则向上取整或向下取整。意思是:1.5一半向下=1,1,5一半向上=2,CEIL将把4.4也凑到5,这不是正确的答案,太棒了!正是我想要的。谢谢分享!!
mysql> select columna_double, columna_float, round ( columna_double, 2) as round_double, round ( columna_float, 2) as round_float from test_redondeo;
+----------------+---------------+--------------+-------------+
| columna_double | columna_float | round_double | round_float |
+----------------+---------------+--------------+-------------+
|        902.025 |       902.025 |       902.02 |      902.03 |
+----------------+---------------+--------------+-------------+
1 row in set (0.00 sec)