如何在MySql中将FLOAT
四舍五入到最接近的INTEGER
?
我已经知道ROUND()
函数了。我提出这个问题的原因是MySql的CCD_;具有与第一个参数"相同的类型;(https://dev.mysql.com/doc/refman/5.7/en/mathematical-functions.html#function_round)
因此,如果我通过一个FLOAT3.6
,那么我将得到一个FLOAT3.0
作为我的答案。如何获取整数3
?
我已经考虑过使用FLOOR(ROUND(x))
。我担心的是浮点舍入问题可能会导致错误的答案。例如,像ROUND(3.2)
这样的东西可能会因为浮点数的实现而返回FLOAT2.99999999999999999999
,然后FLOOR(ROUND(3.2))
会给出错误的答案2
吗。我还想知道是否有比组合两个函数更有效的方法。
有两个选项可以将FLOAT直接转换为整数:convert和cast。两个选项的工作方式基本相同,并且两个选项都需要在有符号整数和无符号整数之间进行选择,因此,如果您使用的是-2147483648到2147483647之间的负数和正数的混合物,则必须使用有符号整数。另一方面,如果你需要4294967295以下的大正数,那么你需要使用无符号整数。
以下是一些例子:
SELECT CONVERT(-3.2, SIGNED);
产生-3
的输出
SELECT CAST(3.6 as SIGNED);
产生4
的输出
SELECT CONVERT(3.3, UNSIGNED);
生成3
的输出注意:如果使用转换后的整数执行算术函数,则必须遵守一些规则。以下是有关强制转换和转换函数的其他信息的链接:mySequel_Dev_CastFunctions
至少在我的MySql版本中,解决方案似乎微不足道:
CAST(x AS UNSIGNED)
(或CAST(x AS SIGNED)
(似乎具有我想要的精确行为,即四舍五入到最接近的整数。
尽管到目前为止,我在文档中找不到任何东西可以确切地确认将FLOAT转换为INTEGER时的行为。我不知道是否有实现可能会截断为零或使用floor。。。
测试
SELECT CAST(-1.8 AS SIGNED); /* -2 */
SELECT CAST(-1.5 AS SIGNED); /* -2 */
SELECT CAST(-1.2 AS SIGNED); /* -1 */
SELECT CAST(1.2 AS SIGNED); /* 1 */
SELECT CAST(1.5 AS SIGNED); /* 2 */
SELECT CAST(1.8 AS SIGNED); /* 2 */
SELECT CAST(-1.8 AS UNSIGNED); /* 0 */
SELECT CAST(-1.5 AS UNSIGNED); /* 0 */
SELECT CAST(-1.2 AS UNSIGNED); /* 0 */
SELECT CAST(1.2 AS UNSIGNED); /* 1 */
SELECT CAST(1.5 AS UNSIGNED); /* 2 */
SELECT CAST(1.8 AS UNSIGNED); /* 2 */