在SQLite中,找到一个数字的上限和下限的最干净的方法是什么?不幸的是,ROUND()
函数是SQLite唯一提供的函数。
Ceil(向上取整):cast(x as int) + (x > cast(x as int))
取x的整数部分,如果小数部分大于0,则加1。
Floor(向下取整):cast(x as int) - (x < cast(x as int))
取x的整数部分,如果小数部分小于0,则减1。
Ceil:
SELECT (cast(amount as int) + (amount > cast(amount as int))) AS amount
FROM SALES WHERE id = 128;
Floor:
SELECT (cast(amount as int) - (amount < cast(amount as int))) AS amount
FROM SALES WHERE id = 128;
我已经使用MySQL的ceil()和floor()函数检查了所有包括负数在内的边界情况。
ROUND()
来实现类似于CEIL
和FLOOR
的效果,只需将手头数字加上或减去0.5即可。我更喜欢这种方法,因为它更易读。SELECT ROUND(amount+0.5, 0) AS amount FROM SALES WHERE id = 128;
SELECT ROUND(amount-0.5, 0) AS amount FROM SALES WHERE id = 128;
感谢Anees在下面的评论中提供的建议,我也没有考虑到那个边角情况。他的解决方案更加健壮。CEIL(1) = 1
而 ROUND(1+0.5, 0) = 2
。虽然如果值不是整数会更好。 - Bertram Gilfoyle请参考 https://www.sqlite.org/lang_mathfunc.html#ceil
显然,SQLite 提供了向上取整的功能:
ceil(X)
ceiling(X)
返回大于或等于X的第一个可表示整数值。 对于X的正值,此例程向远离零四舍五入。对于X的负值,此例程向零四舍五入。
但是,遗憾的是,默认情况下它没有被编译 - 只有在使用-DSQLITE_ENABLE_MATH_FUNCTIONS
编译时才会激活。
0 + (0 > 0)
,因此返回0而不是1。 - Alien426