让我们有一些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));