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



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

我很好奇波浪号的含义,然后我从这个答案中发现:

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

这个答案适用于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标准。但你的眼睛可能会呆滞。

最新更新