数値を特定の数値またはその倍数に丸めたい。整数の場合は問題ありませんが、次の例のように float の倍数に丸めたい場合に問題が発生します。
package
丸めたい数 (または倍数) :
2.6
入力
1
すると、切り上げられるはずです2.6
入力
2,5
すると、切り上げられるはずです2,6
入力すると、切り上げ
3
られるはずです5,2 (2 * 2,6)
割り切れる可能性をチェックするために使用しようとしましfmod
たが、うまくいきません。
皆さんありがとう。
数値を基本フロートで割り、最も近い整数に切り上げて、再度乗算することができます。
疑似コード
def round_to_float(base_float,to_round)
return ceiling(to_round / base_float) * base_float
end
例3
:
ceiling(3.0 / 2.6) * 2.6
ceiling(1.15) * 2.6
2 * 2.6
5.2
複数のチェックには を使用できますがfmod($to_round,$base_float) == 0
、浮動小数点の不正確さは避けられず、浮動小数点数をテストする信頼できる方法ではありません。
epsilon
確実にするには、(コンピューターの機械精度のオーダーで)十分に小さい値を選択し、商to_round/base_float
が.epsilon
floor
すべてを一緒に入れて
def round_to_float(base_float,to_round)
quotient = to_round / base_float
if (absolute_value(quotient - floor(quotient)) < epsilon)
return false
else
return ceiling(quotient) * base_float
end
end
ここで、epsilon は非常に小さい数です。理論的には、マシンの精度である必要があります...通常は10 ^ -9のようなものです。実際には、ほとんどのユースケースでは 10^-4 で十分です。