簡體   English   中英

BigDecimal:最后一個小數為零的問題

[英]BigDecimal: Issue with zero as last decimal

我有一個 Spring Boot 應用程序使用一個提供一些十進制值的 rest api,例如:

"Amount": {
  "Amount": 160.10,
  "Currency": "EUR"
}

我將其映射到給我帶來問題的BigDecimal 我需要最后一個小數,即使它為零,因為我需要沒有小數的金額,即使用BigDecimal.unscaledValue()

對於顯示的數據,我希望x.getAmount().unscaledValue()的輸出為"16010" ,但由於該值在內部表示為160.1 (非顯着 0 被剝離)我得到"1601" ,這是一個因素關閉 10 次,當行中的某些代碼除以 10 時。

該值可以有 0、2 或 3 位小數(取決於貨幣)。

我的第一個想法是使用setScale()方法,但這並沒有給我帶來好運。

解析 json 的 Java 11 代碼:


restTemplate 
  .exchange(request, new ParameterizedTypeReference<List<NotificationMessage>>() {})
  .getBody()

模型:

import com.fasterxml.jackson.annotation.JsonRawValue;
import com.fasterxml.jackson.databind.PropertyNamingStrategies;
import com.fasterxml.jackson.databind.annotation.JsonNaming;

import java.math.BigDecimal;

import lombok.Data;

@Data
@JsonNaming(PropertyNamingStrategies.UpperCamelCaseStrategy.class)
public class TransactionAmount {
//  @JsonRawValue //my test to force it
    private BigDecimal amount;

    private String currency;

}

有沒有辦法可以強制 Spring Boot 保留非有效小數?

(修改 API 以改用字符串不是一種選擇)

解決方案只是引入一個自定義Jackson Mapper ,它將值解析為String而不是float

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.PropertyNamingStrategies;
import com.fasterxml.jackson.databind.annotation.JsonNaming;
import lombok.Data;

import java.math.BigDecimal;

@Data
@JsonNaming(PropertyNamingStrategies.UpperCamelCaseStrategy.class)
public class TransactionAmount {

    private BigDecimal amt;

    private String ccy;
    
    // Custom mapper to make sure we get the complete decimal value - by treating the amount as a String instead of a Float
    @JsonCreator
    public TransactionAmount1(
      @JsonProperty("Amt") String amount, 
      @JsonProperty("Ccy") String ccy) {
        this.amt = new BigDecimal(amount);
        this.ccy = ccy;
    }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM