Strictfp returns 不同系统的不同结果

Strictfp returns different results on different systems

我在 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?

嗯,显示方式肯定不一样...

您已确认打印浮点数的十六进制表示显示值相同:

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

这意味着 float 转换为 String 的实现方式有所不同。

请注意 OpenJDK implementation of java.lang.Float.toString(float)sun.misc.FloatingDecimal 调用方法 - 即它是 JDK 特定的实现。

您需要:

  • 确保您始终运行代码使用相同的实现
  • 提供您自己的始终产生相同结果的实现
  • 指定一个较短的格式,使字符串相同到那么多小数位。