2016-11-30 2 views
-1

Gruß. Ich hatte eine funktionierende Lösung, aber nach mehreren Änderungen am Projekt funktioniert es nicht mehr.Jackson Mapper Integer von JSON analysiert als Doppel mit Drong Präzision

Das Problem: Front-sendender ganzzahliger Wert 565656 das ist ein Attribut des Objekts, das von Jackson ObjectMapper konvertiert wird. Ich muss ein Double mit der Genauigkeit 2 von diesem ganzzahligen Wert bekommen.

Dies ist das Java-Modell:

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

arbeitet vor:

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

Nun ist diese Lösung mir falsch formatierten Werte (wie 5.67657654E8) aus 567657654 geben. Wie wird das empfangene Integer-Attribut in das erforderliche Double konvertiert?

PS. in PostgreSQL DB wird es als numeric(10,2) gespeichert.

EDIT: wohl die richtige Frage ist - warum die empfangene int 567657654 von json POST-Daten deserialisiert double5.67657654E8, die ein "solide" ist 5 + dezimal .67657654E8

+2

Es gibt *** keine solche Sache *** als ein "doppelt mit Präzision 2". Die Genauigkeit von "double" ist bei 53 Binärstellen * fixiert *. – EJP

+0

können Sie so etwas http://stackoverflow.com/questions/11520781/serialize-a-double-to-2-decimal-places-using-jackson in Setter für die Anpassung beim Deserialisieren tun. – TechnoCrat

+0

@EJP Ich denke, er will nur mit ein paar Nullen formatieren, da int sowieso keinen Dezimalteil hat. – m0skit0

Antwort

2

Es gibt kein Problem hier Präzision ist. Jede Ziffer der Eingabe erscheint in der Ausgabe. Sie sehen, aber nicht erkennen, wissenschaftliche Notation für Fließkomma. Der Grund dafür liegt in Ihrem eigenen Code: Sie haben eine itemPrice Spalte, die als NUMERIC(10,2) deklariert ist, aber Sie haben das einem Java Double zugeordnet. Das ist nicht korrekt: Es verursacht dieses Problem; und es wird ungezählte andere weiter unten auf der Strecke verursachen.

Der richtige zu verwendende Java-Typ ist nicht Double oder double, aber BigDecimal.

Nie Verwenden Sie Fließkomma für Geld.

Verwandte Themen