Mysql-将浮点值舍入为最接近的整数



如何在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 */

最新更新