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() は「ゼロから半分を四捨五入する」または「最も近い方向に丸める」規則を使用します。負の場合は次の整数。(つまり、ゼロから四捨五入されます。) 小数部が .5 未満の値は、正の場合は次の整数に切り捨てられ、負の場合は次の整数に切り上げられます。

  • 近似値の数値の場合、結果は C ライブラリに依存します。多くのシステムでは、これは、ROUND() が「最も近い偶数に丸める」規則を使用することを意味します。小数部分を含む値は、最も近い偶数の整数に丸められます。

これまでの最後の編集によると、8202.5 はゼロに向かって丸められています。これはおそらく、 のような正確なデータ型を使用していないことを意味しますDECIMAL。列の型がFLOATまたはDOUBLEの場合、丸めアルゴリズムはプラットフォームに依存します (また、浮動小数点の精度の問題も発生します)。

明示的なキャストが問題を解決するかどうかを確認できます。

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