Mysql ROUND返回错误的值?

时间:2013-01-31 09:06:25

标签: mysql

我有一张规则表:

rule_id  basic   hra  conveyance  medical
      1    0.5  0.25         800     1250

我运行此查询:

SELECT ROUND( 16405 ) AS `CTC`, ROUND( 16405 * r.basic ) AS `basic`,
ROUND( 16405 * r.hra ) AS `hra`, r.conveyance AS `conveyance`,
r.medical AS `medical` 
FROM `rule` AS r
WHERE `r`.`rule_id` =1

返回以下内容:

CTC     basic   hra conveyance  medical  
16405   8202    4101    800          1250

basic的值应为8203,但返回8202。

2 个答案:

答案 0 :(得分:2)

而不是ROUND使用CEIL - 它会将您的价值四舍五入。

CEIL( 16405 * r.basic ) AS  `basic`

答案 1 :(得分:1)

这些是documentation

中解释的规则
  
      
  • 对于精确值数字,ROUND()使用“从零开始的一半”或“向最近的方向”规则:具有小数部分的值   如果为正或向下,.5或更大的值将向上舍入到下一个整数   如果为负,则为下一个整数。 (换句话说,它已圆满了   从零开始。)小数部分小于.5的值是四舍五入的   如果是正数则下降到下一个整数,或者直到下一个整数if   负

  •   
  • 对于近似值数字,结果取决于C库。在许多系统上,这意味着ROUND()使用“round to nearest   甚至“规则:任何小数部分的值都四舍五入到最近   偶数。

  •   

根据你到目前为止的最后一次编辑,8202.5正在向零舍入。这可能意味着您没有使用像DECIMAL这样的确切数据类型。如果您的列类型为FLOATDOUBLE,则舍入算法取决于平台(并且您还会遇到浮点精度问题)。

您可以检查显式强制转换是否解决了问题:

SELECT ROUND(8202.5), ROUND(CAST(8202.5 AS DECIMAL))