1

Windows 8 (Intel Atom Z3775) で次の方法を使用しています。

public static strictfp void main(String args[])
{
    float a = 0.000000002f;
    float b = 90000300000000004f;
    float c = a * b;
    System.out.println(c);
}

それは私に与える:1.80000592E8

実行時

public strictfp void calculate()
{
    float a = 0.000000002f;
    float b = 90000300000000004f;
    float c = a * b;
    Toast.makeText(getApplicationContext(), c + "", Toast.LENGTH_LONG).show();
}

私は得る: 1.8000059E8

なぜそれらは異なるのですか?strictfp を間違って使用していますか?

4

2 に答える 2

1

float の 16 進表現を印刷すると、値が同じであることが示されることを確認しました。

String.format("%08x", Float.floatToIntBits(c))

floatこれは、 aが に変換される方法の実装に違いがあることを意味しStringます。

のOpenJDK 実装がjava.lang.Float.toString(float)からメソッドを呼び出すことに注意してくださいsun.misc.FloatingDecimal。つまり、これは JDK 固有の実装です。

次のいずれかが必要です。

  • 常に同じ実装を使用してコードを実行できるようにするため
  • 常に同じ結果を生成する独自の実装を提供するには
  • より短い形式を指定して、文字列が小数点以下の桁数まで同じになるようにします。
于 2016-04-14T12:40:03.883 に答える
0

うーん、確かに表示方法が違うな…

于 2016-04-14T12:24:23.330 に答える