2016-11-30 2 views
-1

Приветствие. У меня было рабочее решение, но после внесения нескольких изменений в проект он больше не работает.Jackson Mapper integer от json анализируется как двойной с точностью drong

Проблема: Целочисленное значение переднего конца 565656, которое является атрибутом объекта, преобразованного Jackson ObjectMapper. Мне нужно получить двойной с точностью 2 от этого целочисленного значения.

Это ява модель:

public class Item { 

    private int condoId; 
    private Integer itemId; 
    private String owner; 

    @NotNull 
    @Size(min=1, max=60) 
    private String itemTitle; 

    @NotNull 
    @Size(min=1, max=1000) 
    private String itemDescr; 

    @NotNull 
    @Size(min=1, max=45) 
    private String itemEmail; 

    @NotNull 
    @Size(min=1, max=16) 
    private Double itemPrice; 
} 

Работала раньше:

import com.fasterxml.jackson.databind.JsonNode; 
import com.fasterxml.jackson.databind.ObjectMapper; 

    *In controller, received a request data as string data* 

      ObjectMapper mapper = new ObjectMapper(); 
      JsonNode node = null; 
      node = mapper.readTree(data); 
      Item item = mapper.convertValue(node.get("item"), Item.class); 
      NumberFormat formatter = new DecimalFormat(".00"); 
      item.setItemPrice(Double.parseDouble(formatter.format(item.getItemPrice()))); 

Теперь это решение дает мне неправильно отформатированные значения (например, 5.67657654E8) от 567657654. Каков способ преобразования полученного целочисленного атрибута в требуемый двойной?

PS. в PostgreSQL DB хранится как numeric(10,2).

EDIT: вероятно, правильный вопрос - почему полученный int 567657654 из данных POST JSon десериализируется в double5.67657654E8, который представляет собой «твердый» 5 + десятичную .67657654E8

+2

Существует нет такой вещи ***, как «двойной с точностью 2». Точность 'double' * фиксирована * на 53 двоичных разрядах. – EJP

+0

вы можете сделать что-то подобное http://stackoverflow.com/questions/11520781/serialize-a-double-to-2-decimal-places-using-jackson в setter для настройки при десериализации. – TechnoCrat

+0

@EJP Я думаю, он просто хочет отформатировать с помощью пары нулей, так как int не имеет десятичной части. – m0skit0

ответ

2

Там нет точности проблемы. Каждая цифра ввода появляется на выходе. Вы просто видите, но не признаете, научную нотацию для плавающей запятой. Причина этого заключается в вашем собственном коде: у вас есть столбец itemPrice, объявленный как NUMERIC(10,2), но вы сопоставили его с Java Double. Это неверно: это вызывает эту проблему; и это приведет к тому, что другие люди будут двигаться дальше по дорожке.

Правильный тип Java для использования не является Double, или double, но BigDecimal.

Никогда использовать с плавающей запятой.

Смежные вопросы