9

让我们有一些float f = 52.92;。事实上,它会持有类似的值52.91999816894531。但我想使用 json-string 截断那些非有效数字将它传输到我的网络应用程序。我该怎么做?

结果,我需要获取这个json字符串:

{"price": 52.92}

我使用的代码:

float f = 52.92;
JSONObject js_price = new JSONObject();
js_price.put("price", f);
Log.d("json", js_price.toString());

产生这个丑陋的json:

{"price": 52.91999816894531}

另外,我需要"price"是 json 中的数字格式,而不是字符串。

4

6 回答 6

4

看来,我可以使用构造函数JSONObject(String json),如下所示:

JSONObject js_price = JSONObject(String.format("{\"price\": %.2f}", f);

之后我可以用这个对象做任何其他与 json 相关的事情......

于 2012-08-01T18:18:56.490 回答
2

尝试使用 String.format

Log.d("json", String.format("%.2f", f));

编辑:

是否需要使用浮点数,或者您可以尝试加倍吗?

    double d = 52.92;
    JSONObject js_price = new JSONObject();
    js_price.put("price", d);
    Log.d("json", js_price.toString());
于 2012-08-01T17:21:17.310 回答
1

AFAIK,你不能用JSONObject.

由于没有精确的浮点值,因为52.92您确实必须使用字符串格式化规则,但是您不能让 JSON 编码器将该值视为数字而不是带引号的字符串。

你必须这样做:

String json = String.format("{\"price\", %.2f }", f);

无论如何,当在客户端读回 JSON 时,它仍然不会52.92,它会52.91999816894531再次出现。因此,您将实现的只是节省了 JSON 的大小。

另一种选择是将数字乘以 100,然后将其作为整数发送。但是,当您在客户端划分它时,您仍然得到!52.91999...

您还可以继承JSONObject并覆盖此方法:

static public java.lang.String numberToString(java.lang.Number number)
于 2012-08-01T17:19:55.207 回答
0

试试GSON...

class Serializer {

// You can register custom serilaizers to it to suite your needs    
private static Gson gson = new GsonBuilder().create();

    public static final <T> String toJSON(T clazz) {
        return gson.toJson(clazz);
    }
}

然后使用以下代码获取json字符串

float f = 52.92;
Map<String,Object> js_price = new HashMap<String,Object>()
js_price.put("price", f);
String json = Serializer.toJSON(js_price)
于 2012-08-01T17:20:04.317 回答
0

我会将此实用程序类与您自己的参数一起使用:

public class BigDecimalUtils {

    /**
     * <code>MathContext</code> with precision 10 for coordinates.
     */
    private final static MathContext MC = new MathContext(10);

    /** Scale for coordinates. */
    private final static int SCALE = 6;

    public static float format(double aDouble) {
        BigDecimal bdLatitude = new BigDecimal(aDouble, MC).setScale(SCALE, RoundingMode.HALF_UP);
        return bdLatitude.floatValue();
    }

    public static float format(float aFloat) {
        BigDecimal bdLatitude = new BigDecimal(aFloat, MC).setScale(SCALE, RoundingMode.HALF_UP);
        return bdLatitude.floatValue();
    }

}

然后打电话js_price.put("price", BigDecimalUtils.format(f));

于 2015-05-04T09:32:56.690 回答
-2

您可以在反序列化值后尝试此方法

DecimalFormat dec = new DecimalFormat("###.##");

System.out.println(dec.format(value));
于 2012-08-01T17:18:53.283 回答