我对此选择有疑问:
select @a := 992.7500, ROUND(@a * (1 + 18 / 100), 2) AS Total;
总计得到1171.44,但其值必须是1171.45。如果执行Workbench并且我再次运行相同的select,它将获得正确的值。
¿我如何才能获得正确的价值?感谢。
答案 0 :(得分:0)
是正确的值。它只使用了spec的Banker's Rounding。
ROUND()根据第一个参数的类型使用以下规则:
对于精确值数字,ROUND()使用“从零开始的一半” 或“向最近的方向”规则:具有0.5的小数部分的值 如果为正数或向下,则向上舍入到下一个整数 下一个整数,如果是负数。 (换句话说,它是圆形的 零。)小数部分小于.5的值向下舍入到 如果为正,则为下一个整数;如果为负,则为下一个整数。
对于近似值数字,结果取决于C库。上 很多系统,这意味着ROUND()使用“round to even even” rule:具有任何小数部分的值四舍五入到最接近的偶数 整数。
银行家的舍入,或“舍入到最接近的偶数”是double
等不精确数值的首选舍入方法,因为它解决了替代方案的向上偏差。
Bankers Rounding是一种将数量舍入为整数的算法, 其中数字与两个最接近的整数等距 四舍五入到最接近的偶数。因此,0.5轮到0; 1.5轮到2轮。
答案 1 :(得分:0)
如果您使用 SET
语句,您可以在第一次运行时获得正确的值。
SET @a = 992.7500;
select ROUND(@a * (1 + 18 / 100), 2) AS Total;
https://dev.mysql.com/doc/refman/5.6/en/user-variables.html
<块引用>作为一般规则,除了在 SET 语句中,您永远不应为用户变量赋值并在同一语句中读取该值。
<块引用>在同一非 SET 语句中为变量赋值并读取该值的另一个问题是变量的默认结果类型基于其在语句开头的类型。
@a
是使用 SET
时的精确值数。 @a
语句中分配的 SELECT
似乎不是精确值而是近似值数字。
MySQL 8.0(当前)仍然支持您编写的语法,但该语法可能会在 MySQL 的未来版本中删除。
<块引用>以前的 MySQL 版本可以在 SET 以外的语句中为用户变量赋值。 MySQL 8.0 支持此功能以实现向后兼容性,但在未来的 MySQL 版本中可能会被删除。