MySQL中算术与比较表达式的运算精度规则咨询
MySQL数值表达式运算精度规则答疑
比较表达式相关问题解答
- 关于“两个参数均为整数时按整数比较”的精度说明:不存在固定使用TINYINT/INT/BIGINT某一类精度的规则,MySQL会先将两侧整数提升至可完整覆盖两个参数取值范围的最小兼容整数类型再比较:若两个值都在64位BIGINT的取值范围内,统一按BIGINT精度比较;若存在超出BIGINT范围的无符号整数值,会自动提升为DECIMAL类型比较,避免精度丢失。
- 关于“含浮点值时按浮点值比较”的精度说明:比较精度随参与运算的浮点操作数最高精度动态决定,只要有一个操作数是DOUBLE类型,两侧统一按DOUBLE精度比较;仅当两个浮点操作数均为FLOAT类型时,才按FLOAT精度比较。
- 你给出的比较示例判断全部正确,对应逻辑如下:
CREATE OR REPLACE TABLE my_table ( id INT NOT NULL PRIMARY KEY, float_v FLOAT, double_v DOUBLE, decimal_v DECIMAL ); SELECT float_v = double_v as "The precision is DOUBLE", -- 存在DOUBLE操作数,升为DOUBLE精度比较 float_v = float_v as "The precision is FLOAT", -- 两侧均为FLOAT,按FLOAT精度比较 float_v = decimal_v as "The precision is FLOAT", -- DECIMAL遇FLOAT,按FLOAT精度比较 double_v = decimal_v as "The precision is DOUBLE", -- DECIMAL遇DOUBLE,按DOUBLE精度比较 decimal_v = decimal_v as "The precision is DECIMAL", -- 两侧均为DECIMAL,按DECIMAL精度比较 decimal_v = 1 as "The precision is DECIMAL"; -- 整数与DECIMAL比较,按DECIMAL精度比较 /* etc.*/
算术表达式相关问题解答
- 关于“含近似值时按浮点算术规则求值”的精度说明:算术运算的浮点精度选择逻辑和比较规则一致,以参与运算的所有操作数中的最高浮点精度为准动态决定:只要运算中存在DOUBLE类型值、或是被隐式转换为DOUBLE的值(比如参与数值运算的字符串),整个表达式统一按DOUBLE精度计算;仅当所有参与运算的浮点操作数都是FLOAT、且无更高精度的近似值时,才按FLOAT精度计算。
- 注意:DECIMAL精确算术的精度上限为65位,遇到无限小数时会按上下文的小数标度截断,并非数学意义上的绝对精确,例如
1.0/3.0在DECIMAL规则下计算时会截断到对应小数位,因此(1.0/3.0)*3.0的计算结果不会严格等于1.0。 - 你给出的算术运算示例判断全部正确,对应逻辑如下:
SELECT float_v + double_v as "The precision is DOUBLE", -- 存在DOUBLE操作数,按DOUBLE精度计算 float_v + float_v as "The precision is FLOAT", -- 两侧均为FLOAT,无更高精度近似值,按FLOAT精度计算 float_v + decimal_v as "The precision is FLOAT", -- DECIMAL遇FLOAT,整体为近似值表达式,按FLOAT精度计算 double_v + decimal_v as "The precision is DOUBLE", -- DECIMAL遇DOUBLE,按DOUBLE精度计算 decimal_v + decimal_v as "The precision is DECIMAL", -- 两侧均为DECIMAL精确值,按DECIMAL精度计算 decimal_v + 1 as "The precision is DECIMAL"; -- 整数与DECIMAL运算,无近似值,按DECIMAL精度计算 /* etc.*/
- 关于规则适用范围的说明:这套类型提升、精度选择规则是MySQL数值处理的通用底层规则,覆盖所有涉及数值计算的场景,包括算术表达式、比较(关系)表达式、逻辑表达式中的数值计算部分:
- 仅含整数、且整数值未超出BIGINT取值范围的计算、比较场景,统一按BIGINT(64位整数)精度执行整数算术
- 若计算过程中出现整数溢出,非严格SQL模式下MySQL会自动将类型提升为DECIMAL或DOUBLE继续计算;严格SQL模式下溢出会直接报错,类型提升逻辑仍然生效
- 逻辑表达式中内嵌的数值判断(例如
WHERE (a + b) = c类条件),内部计算完全遵循上述精度规则
内容的提问来源于stack exchange,提问作者Grizzly
相关产品推荐
相关产品推荐

