【问题标题】:Why double is converted to int in JSON string为什么 double 在 JSON 字符串中转换为 int
【发布时间】:2014-03-24 19:42:11
【问题描述】:

我刚刚编码将一个双精度值数组放入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);            
    }        
}

输出:

{"双打":[1,2,3]}

【问题讨论】:

  • 是本地化问题吗?
  • 对不起。本地化问题是什么意思?

标签: java org.json


【解决方案1】:

所有数字都是 Javascript 中的浮点数。所以,1.0 和 1 在 JS 中是一样的。 int、float 和 double 没有区别。

由于 JSON 最终将成为 JS 对象,因此添加额外的 '.0' 是没有用的,因为 '1' 也代表浮点数。我想这样做是为了在传递的字符串中保存几个字节。

所以,你会在 JS 中得到一个浮点数,如果你将它解析回 Java,你应该得到一个双精度数。试试看。

同时,如果您对它在屏幕上的显示方式感兴趣,可以尝试一些字符串格式,使其看起来像“1.0”。

【讨论】:

  • +1,我了解到 Javascript 中的所有数字都是浮点数,并且删除了零以节省几个字节,谢谢 :)
  • 不确定答案是否准确,因为问题是关于 Java,而不是 JavaScript。
  • @JasonCapriotti 问题中,Java double 数组转换为 JSON 时,看起来像 JSON 字符串中的整数数组。我解释说 Javascript 中的 float/double/int 没有区别。因此,“.0”是不必要的。所以java中的JSON库不费心添加“.0”。我希望您了解 JSON 是 Javascript 对象表示法。
【解决方案2】:

它实际上并没有被转换成 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]}

【讨论】:

    【解决方案3】:

    查看toString of net.sf.json.JSONObject,它最终会调用以下方法将数字转换为Stringsource 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-14
      • 1970-01-01
      • 1970-01-01
      • 2014-11-18
      • 2018-10-26
      • 2014-06-08
      • 2012-08-04
      • 1970-01-01
      相关资源
      最近更新 更多