2016-04-14 44 views
0

我用下面的方法在Windows 8(英特尔凌动Z3775):Strictfp返回在不同的系统不同的结果

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

+0

如果在两种情况下都输出String.format(“%08x”,Float.floatToIntBits(c)),会发生什么? –

+0

它们返回完全相同的字符串。在两个平台上使用Float.toString(c)转换为String不会有帮助。 – Geosearchef

+0

对 - 所以实际的数字是按位相同的。在将浮动转换为字符串的算法的实现方面存在简单的差异。 –

回答

1

您确认打印彩车的十六进制表示显示的数值是相同的:

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

这意味着有一个float如何转换为String的差异。

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

您将需要两种:

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

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

+0

那改变了什么?我现在为System.out.println()添加了一个'+'“',现在两个浮点数在被赋予该方法之前首先被转换为一个字符串。 – Geosearchef

+0

显然浮点到字符串转换也可以不同。 –

+0

我该如何解决这个问题? – Geosearchef