为什么负数上的波浪号例如~~-1在 MySql 查询中返回 184467440737...

问题描述

我刚刚找到了一种我认为在某些编程语言中使用双波浪号 ~~ 更简单、更快速删除小数的方法

我很好奇波浪号是什么意思,然后我从this answer中了解到:

运算符 ~ 是一个二元否定运算符(与布尔运算符相反) 否定),因此,它反转其操作数的所有位。 结果是二进制补码运算中的负数。

该答案适用于 PHP 语言,我认为 MysqL 也是如此。我想我可以使用 ~ 恢复否定(也删除小数)和 ~~删除小数

我尝试过 PHP 和 JS:

单个波浪号:

    ~-1 // = 1
    ~1 // = -1
    ~-1.55 // = 1
    ~1.55 // = -1

双波浪线:

    ~~-1 // = -1
    ~~1 // = 1
    ~~1.55 // = 1
    ~~-1.55 // = -1

但为什么我在 MysqL 中尝试显示不同的结果:

select ~1; // 18446744073709551614
select ~-1; // 0
select ~-111; // 110
select ~1.55; // 18446744073709551613
select ~-1.55; // 1
select ~~1; // 1
select ~~-1; // 18446744073709551615
select ~~1.55; // 2
select ~~-1.55; // 18446744073709551614

从上面的查询中,我可以得出结论,如果 ~~ 可用于删除正数的小数(四舍五入),但不适用于负数(将返回 18446744073...) .我不知道在 MysqL 中使用 ~。谁能帮我解释一下?

解决方法

“...更快地删除小数...”——不要在这个级别上进行优化。坚持SQL的整体结构。

要将浮点值转换为整数,请使用函数:

mysql> SELECT FLOOR(12.7),CEIL(12.7),ROUND(12.7),ROUND(12.777,2),FORMAT(1234.7,0)\G
*************************** 1. row ***************************
      FLOOR(12.7): 12
       CEIL(12.7): 13
      ROUND(12.7): 13
 ROUND(12.777,2): 12.78
FORMAT(1234.7,0): 1,235

至于 ~ 对浮点数的作用,我们需要进入 IEEE-754 标准。但你的眼睛可能会呆滞。