2025-05-27 10:09

Java中金额计算避免精度丢失

码自答

Java后端

(53)

(0)

收藏

浮点数在计算机中间采用的表示方式是基于 IEEE 754 的标准,这种标准对于非规约形式的浮点数进行舍入运算。这样可能导致某些小数的运算可能会失真,不精确。但对于金融或货币计算时,应尽可能避免精度丢失。

避免精度丢失的方式:

1 BigDecimal 类

    BigDecimal 类提供了精确的小数运算。

package com.wanmait;

import java.math.BigDecimal;

public class Main {
    public static void main(String[] args) {
        BigDecimal number1 = new BigDecimal("1.00");
        BigDecimal number2 = new BigDecimal("3.00");

        //+
        BigDecimal result1 = number1.add(number2);
        System.out.println(result1);

        //-
        BigDecimal result2 = number1.subtract(number2);
        System.out.println(result2);

        //*
        BigDecimal result3 = number1.multiply(number2);
        System.out.println(result3);

        //   /divide(除数,小数点之后位数,四舍五入模式)
        BigDecimal result4 = number1.divide(number2,3,BigDecimal.ROUND_HALF_UP);
        System.out.println(result4);
    }
}


2 指定精度和四射突入

    BigDecimal 类指定精度和输入模式

package com.wanmait;

import java.math.BigDecimal;

public class Main {
    public static void main(String[] args) {
        BigDecimal number1 = new BigDecimal("1.00").setScale(2, BigDecimal.ROUND_HALF_UP);
    }
}


3    转换成整数运算

package com.wanmait;

public class Main {
    public static void main(String[] args) {
        double a = 1.00;
        double b = 3.00;

        int na = (int)(a*100);
        int nb = (int)(b*100);

        double c = (na+nb)/100.0;
        System.out.println(c);
    }
}


4 比较小数是否相同,采用小的容差值

    以下代码的执行结果为 false

package com.wanmait;

import java.math.BigDecimal;

public class Main {
    public static void main(String[] args) {
        double a = 0.1+0.2;
        double b = 0.3;

        System.out.println(a==b);
    }
}

        

小数失真引起的:

设定容差值,两个数的差的绝对值小于容差值就表示两个数相同

package com.wanmait;


public class Main {
    public static void main(String[] args) {
        double a = 0.1+0.2;
        double b = 0.3;

        //容差值
        double min = 1e-10;//10的-10次方
        if(Math.abs(a-b)<min)
        {
            System.out.println(true);
        }
        else {
            System.out.println(false);
        }
    }
}


0条评论

点击登录参与评论