繁体   English   中英

BigDecimal:最后一个小数为零的问题

BigDecimal: Issue with zero as last decimal

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我有一个 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 以改用字符串不是一种选择)

1 个回复

解决方案只是引入一个自定义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;
    }

}
3 TreeMap将BigDecimal键放在小数点后尾的零处无效

在地图中将值放入键中,而不在键中增加值 在上图3.10中未在密钥中添加。 所以我试图计算两个值的哈希码 两个哈希码都计算出相同的值,我的要求是我想将两个值都放入地图中,因此在其他论坛帖子的帮助下,看来我必须重写hashCode()方法,但它将int作为值返回并且我我不确定这对我的情况有帮助 ...

6 SQL Server将最后一个数字替换为十进制的零

在SQL Server 2016中,我有一列类型为decimal(16, 3) 。 当我从C#代码插入时,我传递了类似1.234的十进制值。 此值将像1.230一样保存在数据库中。 SQL Server将最后一个数字(在这种情况下为4)替换为0。如何避免这种情况? ...

8 格式化十进制c# - 保持最后一个零

我一直在寻找这个,但似乎无法找到答案。 我有以下小数与我想要的String.Format相应的输出 100.00 - &gt; 100 100.50 - &gt; 100.50 100.51 - &gt; 100.51 我的问题是我似乎无法找到一种格式,它将0保持在100. ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM