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

use*_*579 2 java floating-point java-native-interface

我有一个函数返回从JNI本机到Java的float.这应该是一个简单的电话,但我得到了奇怪的结果.

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

cout << result << endl;  cout.flush(); // get 1.61863e+010
return (jfloat) result;
Run Code Online (Sandbox Code Playgroud)

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

但是我的Java代码正在接收1.61863004E10.我用的时候

DecimalFormat formatter = new DecimalFormat("###,###.######");
System.out.println(formatter.format(result));
Run Code Online (Sandbox Code Playgroud)

我得到16,186,300,416.

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

非常感谢.

Jon*_*eet 6

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