【问题标题】:Big Decimal formatting after rounding舍入后的大十进制格式
【发布时间】:2017-02-21 18:37:38
【问题描述】:

我在使用 Big Decimal 及其舍入后的格式时遇到问题。我的输入价格为 35.90,输出返回 35.9

这就是我四舍五入的方式:

BigDecimal scaledResult = rs.getPrice().setScale(2, BigDecimal.ROUND_HALF_UP);
sc.setPrice(scaledResult);

即使我已将比例设置为小数点后两位,它也会返回 35.9 输出。有任何想法吗?

【问题讨论】:

  • 这不是舍入问题(如 35.9 == 35.90),这是格式问题。
  • 当你说它返回 35.9,你是什么意思?你在某处输出结果?
  • 打印scaledResult.toString()的结果会得到什么?
  • API?客户端?在某处,您以某种方式从BigDecimal 转换为字符串表示以获得“35.9”。这就是你的问题所在。如果没有minimal reproducible example,我们真的不能说更多。
  • 所以你的 BigDecimal 值是正确的......也许 API 不保持你的 BigInteger 的规模?尝试向 API 传递一个值,例如 new BigDecimal("12.30")... 如果这不起作用,那么问题出在 API 本身...

标签: java currency bigdecimal price


【解决方案1】:

感谢大家的帮助,这是我通过编写序列化程序解决的方法:

public class BigDecimalSerializer extends JsonSerializer<BigDecimal> {
    @Override
    public void serialize(BigDecimal value, JsonGenerator jgen, SerializerProvider provider) throws IOException,
            JsonProcessingException {
        jgen.writeString(value.setScale(2, BigDecimal.ROUND_HALF_UP).toString());
    }
}

我的模型的字段:

@JsonSerialize(using = BigDecimalSerializer.class)
private BigDecimal price;

【讨论】:

    【解决方案2】:

    您的四舍五入工作正常。您没有得到尾随零的原因正在返回回复BigDecimal,相反,您需要返回String(其他人也提到过)。

    使用@JsonFormat annotationshape 作为STRING 在您的响应对象中的BigDecimal 变量之上有一种简单的方法。参考如下:

     import com.fasterxml.jackson.annotation.JsonFormat;
    
      class YourResponseObjectClass {
    
        @JsonFormat (shape=JsonFormat.Shape.STRING)
        private BigDecimal price;
    
     }
    

    【讨论】:

      猜你喜欢
      • 2020-10-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多