Strictfp在不同的系统上返回不同的结果

时间:2016-04-14 12:16:19

标签: java floating-point strictfp

我在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错了吗?

2 个答案:

答案 0 :(得分:1)

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

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

这意味着将float转换为String的方式的实现存在差异。

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

你需要:

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

答案 1 :(得分:0)

嗯,显示方法肯定不同......