我是靠谱客的博主 鳗鱼便当,这篇文章主要介绍【工作沉淀】金融系统中正确的金额计算及存储方式,现在分享给大家,希望可以做个参考。

 

经典的精度丢失问题

  • Java中的类型float、double用来做计算会有精度丢失问题,下面来看下面的示例。
public class FloatCast1 {
    public static void main(String[] args) {
        //Float_test();

        //Double_test();
    }

    public static void Double_test() {
        double totalAmount = 0.09;
        double feeAmount = 0.02;
        double tradeAmount = totalAmount - feeAmount;
        // double 丢失精度的情况:0.06999999999999999
        System.out.println("double 丢失精度的情况:"+tradeAmount);
    }

    public static void Float_test() {
        float f1 = 6.6f;
        float f2 = 1.3f;
        // 会丢失精度(只统计前23位)  f1+f2 = 7.8999996
        System.out.println("f1+f2 = "+(f1+f2));
    }
}

为什么是这样?

  • 浮点数可能丢失精度,浮点十进制数通常没有完全相同的   二进制的表示形式,这是CPU所采用的浮点数据表示形式的副作用。为此,可能会有一些精度丢失,并且一些浮点运算可能会产生未知的结果。
  • 浮点运算很少是精确的,只要是超过精度能表示的范围就会产生误差。所以,在使用float、double作精确运算的时候一定要特别小心,除非能容忍精度丢失,不然产生的误差也是会造成双方对账不一致的结果。

具体分析相关文章

  1. 金融系统中正确的金额计算及存储方式 (小数有循环只计前23位)

怎么解决

在《Effective Java》这本书中也提到这个原则,float和double只能用来做科学计算或者是工程计算,在商业计算中我们要用 java.math.BigDecimal。

BigDecimal适合更精度的运算,也提供了丰富的操作符类型,小数位控制,四舍五入规则等。

不过,使用BigDecimal不当也有精度丢失的情况,如double的构造方法:

BigDecimal(double val)

再来看这个示例:

private static void test2() {
    double totalAmount = 0.09;
    double feeAmount = 0.02;
    BigDecimal tradeAmount = new BigDecimal(totalAmount).subtract(new BigDecimal(feeAmount));
    System.out.println(tradeAmount);
}

输出:

0.0699999999999999962529972918900966760702431201934814453125

这个精度就更恐怖了。。

所以,一定要使用String的构造方法:

BigDecimal(String val)
private static void test3() {
    double totalAmount = 0.09;
    double feeAmount = 0.02;
    BigDecimal tradeAmount = new BigDecimal(String.valueOf(totalAmount))
            .subtract(new BigDecimal(String.valueOf(feeAmount)));
    System.out.println(tradeAmount);
}

总结

  1. 金额运算尽量使用BigDecimal(String val)进行运算。

  2. 数据库存储金额,一般有整型和浮点型两种存储方式。如果是有汇率转换的,建议使用浮点数decimal进行存储,可以灵活的控制精度,decimal直接对应java类型BigDecimal。当然,用整数存储分这种形式也可以,转账的时候单位为元而如果忘了转换分为元,那就悲剧了。

 

最后

以上就是鳗鱼便当最近收集整理的关于【工作沉淀】金融系统中正确的金额计算及存储方式的全部内容,更多相关【工作沉淀】金融系统中正确内容请搜索靠谱客的其他文章。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(99)

评论列表共有 0 条评论

立即
投稿
返回
顶部