



Догадаться. Можно использовать переходник типа:
GsonBuilder builder = new GsonBuilder();
builder.registerTypeAdapter(Double.class, (JsonSerializer<Double>) (src, typeOfSrc, context) -> {
DecimalFormat df = new DecimalFormat("#.####");
df.setRoundingMode(RoundingMode.CEILING);
return new JsonPrimitive(Double.parseDouble(df.format(src)));
});
Gson gson = builder.create();
Поскольку вы не находитесь в части света с десятичной точкой, вам нужно добавить df.setDecimalFormatSymbols(US_FORMATTER_SYMBOLS);
На самом деле я думаю, что это ведет себя точно так же, как Math.rint(src * 10000) / 10000, за исключением случаев, когда значение близко к абсолютному максимальному двойному значению. Я думаю, что в обоих случаях он все еще может рендерить двойник с длинным хвостом в ± 1ulp, если вам не повезет.
Если вы пытаетесь это сделать в Котлин, ответ Амана все равно будет работать, но вы должны использовать токен типа, а не Double.class (или Double :: class.java):
builder.registerTypeAdapter(object: TypeToken<Double>() {}.type, ...
Следующий фрагмент кода не работает:
DecimalFormat df = new DecimalFormat("#.####"); df.setRoundingMode(RoundingMode.CEILING); Double.parseDouble(df.format(Double.valueOf(0.0123457d)));сjava.lang.NumberFormatException: For input string: "0,0124".