0

我有一个规则表:

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。

4

2 回答 2

2

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

CEIL( 16405 * r.basic ) AS  `basic`
于 2013-01-31T09:09:32.583 回答
1

这些是文档中解释的规则:

  • 对于精确值数字,ROUND() 使用“离零取半数”或“向最近取整”规则:小数部分为 0.5 或更大的值向上取整到下一个整数(如果为正数)或向下取整到如果为负,则为下一个整数。(换句话说,它从零四舍五入。)小数部分小于 0.5 的值如果为正则向下舍入到下一个整数,如果为负则向上舍入到下一个整数。

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

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

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

SELECT ROUND(8202.5), ROUND(CAST(8202.5 AS DECIMAL))
于 2013-01-31T09:26:15.747 回答