0

処理中に浮動小数点数を小数点以下第2位に四捨五入する方法はありますか?

例えば

float x = 1.0000001
float y = 1.1000000001

float a = x + y
round(a)

a = 2.10

処理の標準round()は最も近い整数に丸められますが、小数を配置する必要があります。探している機能を実行する関数が見つかりません。小数点以下100桁を超えるフロートがあるので、可能であれば、それらをトリミングする必要があります。

4

3 に答える 3

2

より処理中心の関数は次のとおりです。

float fixDec(float n, int d) {
  return Float.parseFloat(String.format("%." + d + "f", n));
}

そしてそれをテストするには:

float x = 1.0000001;
float y = 1.1000000001;
x = fixDec(x, 2);
y = fixDec(y, 2);
float a = x + y;
round(a);

これはおそらく最も効率的なアルゴリズムではありませんが、機能します。

于 2012-12-11T07:11:41.743 に答える
1

私は処理に精通していません。ただし、整数への丸め関数を指定して小数点以下の桁数を固定する一般的な方法は次のとおりです。

a = round(a * PowerOf10) * InversePowerOf10

したがって、小数点以下1桁の場合は、次を使用できます。

a = round(a * 10) * .1

いくつかの警告とコメントがあります:

  • これは、バイナリ浮動小数点では機能しません。.1のような数値は、2進浮動小数点で正確に表すことができないため、不可能です。あなたのニーズとあなたが適切な世話をするかどうかに応じて、十分に近いかもしれません。
  • 10進浮動小数点では問題ないかもしれませんが、10進浮動小数点はまれです。処理が10進浮動小数点を実装している場合は、すべて設定されている可能性があります。
  • 通常、乗算は除算よりも高速であるため、両方の演算に乗算を使用しました。ただし、特定の状況では除算を使用することが望ましい場合がありますa = round(a * PowerOf10) / PowerOf10。(特に、バイナリ浮動小数点では、これにより、PowerOf10の逆数を計算する際の余分な丸め誤差が回避されます。)
  • 処理によって拡張精度のバイナリ浮動小数点が提供される場合、正確ではありませんが、結果は目的に十分近い可能性があります。
  • さらに計算するのではなく、表示用に数値をフォーマットする場合は、数値の丸め関数ではなく、文字列のフォーマット関数を探してください。文字列内の数値から10進数への変換は、2進浮動小数点でも正確に実行できます。
于 2012-12-07T22:09:08.490 に答える
0

浮動小数点数は正確ではないため、丸め誤差のために小さな値(0.0001など)を追加しないでください。常に増分するとは限りません。小さな間隔で値をインクリメントする場合は、intを使用し、float値で除算してから使用します。

http://processing.org/reference/float.html

int i = 10001000;
int j = 11000001;

float a = round((i + j)/pow(10,5));

a /= 100;

println(a);

2.1

于 2012-12-08T03:08:35.570 に答える