我有一个函数可以将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浮点数,所以不应该有任何精度损失。
非常感谢。
答案 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