>我有一个规则表:
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
基本值应为 8203,但返回 8202。
而不是ROUND
使用CEIL
- 它将四舍五入您的值。
CEIL( 16405 * r.basic ) AS `basic`
这些是文档中解释的规则:
对于精确值数字,ROUND() 使用"从零舍入一半"或"舍入到最近"规则:带有小数部分的值 如果为 .5 或更大,则向上舍入到下一个整数(如果为正或向下) 如果为负数,则为下一个整数。(换句话说,它是四舍五入的 从零开始。小数部分小于 .5 的值将四舍五入 如果为正,则向下到下一个整数,如果为,则向下到下一个整数 阴性。
对于近似值数字,结果取决于 C 库。在许多系统上,这意味着 ROUND() 使用"舍入到最接近" 偶数"规则:包含任何小数部分的值将四舍五入到最接近的值 偶数。
根据您到目前为止的最后一次编辑,8202.5 正在四舍五入到零。这可能意味着您没有使用像 DECIMAL
这样的精确数据类型。如果列类型为 FLOAT
或 DOUBLE
,舍入算法取决于平台(并且您还受到浮点精度问题的影响)。
您可以检查显式强制转换是否可以解决问题:
SELECT ROUND(8202.5), ROUND(CAST(8202.5 AS DECIMAL))