如何在将float编码为JSON时将其截断为%.2f格式



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

因此,我需要获得这个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中的数字格式,而不是字符串。

我似乎可以使用constractor JSONObject(String.json),类似于以下内容:

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

在那之后,我可以对这个对象做任何其他与json相关的事情。。。

尝试使用字符串格式

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());

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)

试试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)

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

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));

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

DecimalFormat dec = new DecimalFormat("###.##");
System.out.println(dec.format(value));

最新更新