4

ファジージョブの粒度を維持する必要があるため、パラメーターとして受け取る関数を作成しました。

  • 粒度 (0 と 1 の間の double、0 は含まれません)
  • 必要に応じて変換する値 (0 より大きい double)

そして、正しい粒度で新しい値を返します。

これは私が持っている機能です:

public static double preserveGranularity(double granul, double value){
    double integerValue= (double)(int)value;
    if(granul == 1)
        return integerValue;
    double decimal = value - integerValue;
    long factor = Math.round(decimal/granul);
    return integerValue + granul*factor;
}

例:

  • preserveGranularity(0.25, 7.7) は 7.75 を返す必要があります
  • preserveGranularity(0.01, 0.009) は 0.01 を返す必要があります

ほとんどの値でうまく動作しますが、すべてではありません (例: preserveGranularity(0.2, 0.57)=0.6000000000000001、0.6 を返す必要があります)。

よろしく

PSこの質問で間違いを犯して申し訳ありません。これは私の最初のものです

4

2 に答える 2

4

double十分に正確ではないため、-で これを達成することはできません。
doublesは実数ではありません。それらを表すビットの数は有限ですが、実数(または有理数)の数は無限にあるため、これらの丸め誤差が予想されます。

BigDecimalたとえば、そのround()メソッドを使用して、必要に応じて粒度を制御できる、を探していると思います。

于 2012-05-10T18:50:04.463 に答える
1

浮動小数点の計算は正確ではありません(コンピューターは非常に多くの桁しか表現できません)。これは、除算/乗算/丸め/減算/加算操作のどこかで精度が失われることを意味します。

于 2012-05-10T18:50:32.917 に答える