Mysql-半向下或半向上取整
有没有办法指定在使用MySql的sql查询中,是否要将字段值4.485四舍五入到4.48(半向下)或4.49(半向上) 感谢使用mysqlMysql-半向下或半向上取整,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
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)