float从jni返回到java收到了错误的结果

时间:2012-06-20 16:41:45

标签: java floating-point java-native-interface

我有一个函数可以将JNI本地的float返回给Java。这应该是一个简单的电话,但我得到了奇怪的结果。

在我的测试用例中,我将值1.61863e + 010返回到java。代码很简单:

cout << result << endl;  cout.flush(); // get 1.61863e+010
return (jfloat) result;

(只是为了澄清,如果cout.precision(6),我得到16186300000.000000)

但是我的Java代码正在接收1.61863004E10。当我使用

DecimalFormat formatter = new DecimalFormat("###,###.######");
System.out.println(formatter.format(result));

我得到16,186,300,416。

这416来自哪里? 我认为jfloat和float都是32位IEEE浮点数,所以不应该有任何精度损失。

非常感谢。

2 个答案:

答案 0 :(得分:6)

你正在使用float,它只有7个十进制数字的精度(23位尾数,带有标准化数字的隐含位)。因此,您应该将之后的任何内容视为有效噪音。您的值实际上并没有改变 - 只是显示的表示形式在Java和C ++实现之间有所不同。

答案 1 :(得分:3)

它的C ++程序是一个lileky,可以舍入到7个有效数字,这是float的精度。如果将Java中的值四舍五入为7位,则会给出相同的数字。使用DecimalFormat时,它将默认打印最接近的整数。

System.out.println("(float) " + 16186300000.0 + 
                   " is actually " + new BigDecimal((float) 16186300000.0));

打印

(float) 1.61863E10 is actually 16186300416