我有一张规则表:
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。
答案 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
这样的确切数据类型。如果您的列类型为FLOAT
或DOUBLE
,则舍入算法取决于平台(并且您还会遇到浮点精度问题)。
您可以检查显式强制转换是否解决了问题:
SELECT ROUND(8202.5), ROUND(CAST(8202.5 AS DECIMAL))