この問題はMySQLに固有のものではありません。これは、10進値の近似値を格納するIEEE浮動小数点表現の一般的な問題です。(IEEE浮動小数点型は正確な基数2表現を格納します。)
したがって、これは乗算演算の「失敗」ではありません。レート用に保存した値は、(明らかに).0025の10進値でした。この値はIEEE浮動小数点で正確に表すことができないため、格納されるのは可能な限り最も近い近似値です。その概算値に2000を掛けると、結果も概算値になり、表示のために10進数に変換されます。
「修正」は、浮動小数点型ではなくDECIMALデータ型を使用し、浮動小数点演算ではなく「10進数」演算を使用して乗算演算を実行することです。
You can attempt to have that approximation reversed, by converting it back to decimal of specified precision, before you do the multiplication:
SELECT (CAST(table.rate AS DECIMAL(18,4) * 2000) AS per_ton ...
Or, you can try using the ROUND() function to trim off the digits of precision you don't need, e.g.
SELECT ROUND((table.rate * 2000),4) AS per_ton ...
That will get the result rounded up to 5.0000
The real "fix" though, is to define your columns with DECIMAL datatype, and AVOID using floating point columns at all.
This behavior of floating point values is well documented, albeit, at the end of the manual:
http://dev.mysql.com/doc/refman/5.1/en/problems-with-float.html