我刚编码在JsonObject
中放置一个double值数组。但是,当我打印它时,我的所有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);
}
}
输出:
{ “双打”:[1,2,3]}
答案 0 :(得分:7)
所有数字都是Javascript中的浮点数。所以,JS和1.0中的1.0和1相同。没有int,float和double的区别。
由于JSON最终将作为JS对象,因此添加额外的'.0'是没有用的,因为'1'也代表浮点数。我想这样做是为了在传递的字符串中保存几个字节。
所以,你将在JS中获得一个浮点数,如果你将它解析回Java,你应该得到一个双精度数。试试吧。
与此同时,如果您对屏幕上显示的方式感兴趣,可以尝试一些字符串格式,使其看起来像“1.0”。
答案 1 :(得分:6)
查看toString
of net.sf.json.JSONObject
,它最终会调用以下方法将数字转换为String
(source code here):
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;
}
它显然试图在可能的情况下摆脱尾随的零,(s = s.substring(0, s.length() - 1)
如果一个字符串以零结尾)。
System.out.println(numberToString(1.1) + " vs " + numberToString(1.0));
给出,
1.1 vs 1
答案 2 :(得分:5)
它实际上没有转换成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]}