Mysql的。函数ROUND没有给出正确的值

时间:2015-08-17 20:58:50

标签: mysql function rounding

我对此选择有疑问:

select @a := 992.7500, ROUND(@a * (1 + 18 / 100), 2) AS Total;

总计得到1171.44,但其值必须是1171.45。如果执行Workbench并且我再次运行相同的select,它将获得正确的值。

¿我如何才能获得正确的价值?感谢。

2 个答案:

答案 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 版本中可能会被删除。