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 特定的实现。
您需要:
- 确保您始终运行代码使用相同的实现
- 提供您自己的始终产生相同结果的实现
- 指定一个较短的格式,使字符串相同到那么多小数位。
我在 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 特定的实现。
您需要:
- 确保您始终运行代码使用相同的实现
- 提供您自己的始终产生相同结果的实现
- 指定一个较短的格式,使字符串相同到那么多小数位。