从jni到java的浮点返回收到错误的结果

从jni到java的浮点返回收到错误的结果,java,floating-point,java-native-interface,Java,Floating Point,Java Native Interface,我有一个函数,它将float从JNI本机返回到Java。这应该是一个直截了当的电话,但我得到了奇怪的结果 在我的测试用例中,我将值1.61863e+010返回到java中。代码很简单: cout << result << endl; cout.flush(); // get 1.61863e+010 return (jfloat) result; 我得到16186300416 这416是从哪里来的? 我认为jfloat和float都是32位IEEE浮点,所以不应该有任

我有一个函数,它将float从JNI本机返回到Java。这应该是一个直截了当的电话,但我得到了奇怪的结果

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

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

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


非常感谢。

您使用的是
浮点
,它只有7位小数精度(尾数的23位,隐式位表示标准化数字)。因此,你应该将这之后的任何事情视为有效的噪音。你的价值并没有真正改变——只是显示的表达在java和C++实现之间有所不同。

< p>它是C++程序,它是7个有效数字的整数,它是<代码>浮点< /代码>的精度。如果您将Java中的值四舍五入到7位,您将给出相同的数字。使用DecimalFormat时,默认情况下,它将打印最接近的整数

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

(float) 1.61863E10 is actually 16186300416

这意味着,在我的例子中,最好的方法是通过字符串返回?i、 例如,在jni中对jstring进行浮点运算,然后在java中再次解析字符串进行浮点运算?@user1086579:为什么要这样做?这个数字从C++到java都正确地返回了。仅仅因为字符串表示不同并不意味着你得到了错误的答案。如果用Java解析字符串,仍然会得到相同的浮点值,最后是416。
(float) 1.61863E10 is actually 16186300416