Java 奇怪的浮点输出“@”。0E-12“;黑莓安卓播放器

Java 奇怪的浮点输出“@”。0E-12“;黑莓安卓播放器,java,android,blackberry-playbook,blackberry-android,Java,Android,Blackberry Playbook,Blackberry Android,我有一个在许多Android设备上运行良好的应用程序,但在PlayBook上运行的BlackBerry Android player(它运行的是Android 2.3)上有一个问题 我对PreferenceManager.GetDefaultSharedReferences()有一个NumberFormatException。在首选项文件中,浮点值似乎保存为“@.0E-12”。我做了一个简单的测试: float f = 1.0e-12f; System.out.println (f); // p

我有一个在许多Android设备上运行良好的应用程序,但在PlayBook上运行的BlackBerry Android player(它运行的是Android 2.3)上有一个问题

我对PreferenceManager.GetDefaultSharedReferences()有一个NumberFormatException。在首选项文件中,浮点值似乎保存为“@.0E-12”。我做了一个简单的测试:

float f = 1.0e-12f;
System.out.println (f); // prints "@.0E-12" on BlackBerry PlayBook !!
这怎么可能?

这是一个非常小的数字(即0.000000..01)。
如果它对您有任何意义,您可以尝试
BigDecimal


否则,你可以决定小于x的数字(你决定x有多小)是0。

如果你的问题是这是怎么回事?我想你可以下载Android源代码,在libcore/luni/src/main/java/java/lang中找到相关的源代码,从Float.toString()开始,开始将函数逐个导入到你的项目中,每次仍然看到错误时都进行检查。您将找到该错误,它可能与FP数学有关。(可能是尾数最低有效部分的随机位。)

Hmm可能是黑莓在转换过程中出错了。你可以试试BigDecimal而不是Float来看看这是否有效?在我的电脑中,它会打印“1.0E-12”,请试试
System.out.println(new Float(f).toString())
。如果它是一个bug,很可能在那个类中。我在安卓手机上得到
f=1.0E-12
。与
new Float(f).toString()
一样的bug。我必须使用Float(不是BigDecimal)将Android设置保存在SharedReferences中。除了PlayBook之外,它在所有Android系统上都能正常工作。而且这个数字也不是那么小。这不是Android的问题(它在所有模拟器上都能正常工作)但只适用于PlayBook Android player。我的意思是,您可以在代码中找到一个位置,该位置适用于除PlayBook Android player之外的所有平台。然后,它要么是Java bug(它可能依赖于某些未记录的东西,而这些东西恰好适用于大多数平台)当然,如果你真的对如何实现这一点感兴趣的话?我想你不需要黑莓的源代码,谷歌的代码就可以了。黑莓团队不太可能认为这是一个好的代码,并在其中引入了一个错误,首先是因为修改黑莓没有任何利润很可能,代码与Android源代码发行版中的代码相同,因此即使是开源的原始代码,您也会看到潜在的问题。(但即使它们确实引入了错误,这是不可能的,您也会知道哪个函数给出了不正确的结果。)