澄清应用于非整数值的MySQL DIV运算符

时间:2014-09-27 10:23:23

标签: mysql math sqldatatypes

当有人的操作数不是整数时,有人可以澄清MySQL DIV运算符如何工作,或者应该工作吗?

据说它执行“整数除法” - 但是当操作数不是整数时,它看起来像FLOOR(x / y)而不是(预期的)FLOOR(x)DIV FLOOR(y)。

例如,使用MySQL v5.5.37:

SELECT 5.6 DIV 5.7
SELECT 5.7 DIV 5.6

分别返回0和1。

根据MySQL手册:

  

整数除法。与FLOOR()类似,但BIGINT值是安全的。

     

从MySQL 5.5.3开始,如果任一操作数具有非整数类型,则操作数将转换为DECIMAL,并在将结果转换为BIGINT之前使用DECIMAL算术进行除法。如果结果超出BIGINT范围,则会发生错误。

这很令人困惑,因为我希望“cast into decimal”会转换为整数值,即

SELECT CAST(5.4 AS DECIMAL)
SELECT CAST(5.6 AS DECIMAL)

分别产生“5”和“6”。

可能的解释是这个(在手册第12.2节的其他地方找到):

  

从MySQL 5.5.3开始,服务器包含dtoa,这是一个转换库,它提供了改进字符串或DECIMAL值与近似值(FLOAT / DOUBLE)数字之间转换的基础:

。 。

  
      
  • F - > D转换以尽可能高的精度完成,返回D作为最短的字符串,当读回时产生F并舍入到IEEE规定的本机二进制格式中的最接近的值。
  •   

......所以这对我的意思是表达式:

6.3 DIV 3.141592

实际上被评估为:

FLOOR( (CAST (6.3 AS DECIMAL(65,1)) / (CAST (3.141592 AS DECIMAL(65,6))) )

此外,手册(第12.6.1节)说:

  
      
  • 在使用/执行除法时,使用两个精确值操作数时的结果比例是第一个操作数的比例加上div_precision_increment系统变量的值(默认为4)。例如,表达式5.05 / 0.014的结果具有六位小数的比例(360.714286)。
  •   

但是(对我来说)在使用DIV时这是否应该适用于中间分割结果还不清楚。显然它没有:

SELECT 1999999.9 / 1000000 
SELECT 1999999.9 DIV 1000000

分别产生“2.00000”和“1”。

因此,MySQL中的“x DIV y”看起来像:

FLOOR( (CAST (x AS DECIMAL(65,x’s decimal places)) / (CAST (y AS DECIMAL(65,y’s decimal places))

...除非在应用FLOOR()之前没有对中间分割结果进行舍入,否则

知道MySQL实际规格的人能否确认,否认,评论或阐明这一点?

我犹豫是否使用此运算符而没有100%确定它正在做什么,官方文档只是没有提供充分的解释!

0 个答案:

没有答案