2

数値を特定の数値またはその倍数に丸めたい。整数の場合は問題ありませんが、次の例のように float の倍数に丸めたい場合に問題が発生します。

package丸めたい数 (または倍数) :

2.6

入力1すると、切り上げられるはずです2.6

入力2,5すると、切り上げられるはずです2,6

入力すると、切り上げ3られるはずです 5,2 (2 * 2,6)

割り切れる可能性をチェックするために使用しようとしましfmodたが、うまくいきません。

皆さんありがとう。

4

1 に答える 1

3

数値を基本フロートで割り、最も近い整数に切り上げて、再度乗算することができます。

疑似コード

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が.epsilonfloor

すべてを一緒に入れて

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 で十分です。

于 2013-06-14T06:46:34.293 に答える