Gson: форматирование двойных значений до 4 знаков после запятой

Как я могу сделать двойные значения формата Gson округлением (или усечением) до 4 знаков после запятой?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
3
0
2 220
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Догадаться. Можно использовать переходник типа:

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

Следующий фрагмент кода не работает: DecimalFormat df = new DecimalFormat("#.####"); df.setRoundingMode(RoundingMode.CEILING); Double.parseDouble(df.format(Double.valueOf(0.0123457d))); с java.lang.NumberFormatException: For input string: "0,0124".

Jorge Lavín 04.09.2019 11:10

Поскольку вы не находитесь в части света с десятичной точкой, вам нужно добавить df.setDecimalFormatSymbols(US_FORMATTER_SYMBOLS);

Mark Jeronimus 09.10.2019 10:37

На самом деле я думаю, что это ведет себя точно так же, как Math.rint(src * 10000) / 10000, за исключением случаев, когда значение близко к абсолютному максимальному двойному значению. Я думаю, что в обоих случаях он все еще может рендерить двойник с длинным хвостом в ± 1ulp, если вам не повезет.

Mark Jeronimus 09.10.2019 10:58

Если вы пытаетесь это сделать в Котлин, ответ Амана все равно будет работать, но вы должны использовать токен типа, а не Double.class (или Double :: class.java):

builder.registerTypeAdapter(object: TypeToken<Double>() {}.type, ...

Другие вопросы по теме