我刚刚编写了一个双精度值数组JsonObject.但是,当我打印它时,我的所有double值都会转换为int值.谁能帮我理解背后发生的事情?请让我知道放置原始数组的最佳方法JsonObject
public class JsonPrimitiveArrays {
public static void main(String[] args) {
JSONObject jsonObject = new JSONObject();
double[] d = new double[]{1.0,2.0,3.0};
jsonObject.put("doubles",d);
System.out.println(jsonObject);
}
}
Run Code Online (Sandbox Code Playgroud)
输出:
{ "双打":[1,2,3]}
所有数字都是Javascript中的浮点数.所以,JS和1.0中的1.0和1相同.没有int,float和double的区别.
由于JSON最终将作为JS对象,因此添加额外的".0"是没有用的,因为"1"代表浮点数.我想这样做是为了在传递的字符串中保存几个字节.
所以,你将在JS中得到一个浮点数,如果你将它解析回Java,你应该得到一个双精度数.试试吧.
同时,如果您对屏幕上显示的方式感兴趣,可以尝试一些字符串格式,使其看起来像"1.0".
它实际上没有转换成int.唯一发生的事情是JS对象没有显示.0哪些不相关.
在您的示例程序中,将某些值更改double[] d = new double[]{1.0,2.0,3.0}为
double[] d = new double[]{1.0,2.1,3.1} 并运行该程序.
您将在实际中观察它而不是转换为int.你会得到的输出是{"doubles":[1,2.1,3.1]}
看toString的net.sf.json.JSONObject是最终调用下面的方法来翻译号码String(这里的源代码):
public static String numberToString(Number n) {
if (n == null) {
throw new JSONException("Null pointer");
}
//testValidity(n);
// Shave off trailing zeros and decimal point, if possible.
String s = n.toString();
if (s.indexOf('.') > 0 && s.indexOf('e') < 0 && s.indexOf('E') < 0) {
while (s.endsWith("0")) {
s = s.substring(0, s.length() - 1);
}
if (s.endsWith(".")) {
s = s.substring(0, s.length() - 1);
}
}
return s;
}
Run Code Online (Sandbox Code Playgroud)
它显然试图摆脱尾随的零,(s = s.substring(0, s.length() - 1)如果一个字符串以零结尾).
System.out.println(numberToString(1.1) + " vs " + numberToString(1.0));
Run Code Online (Sandbox Code Playgroud)
给人,
1.1 vs 1
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
21653 次 |
| 最近记录: |