BigDecimal类的学习

import java.math.BigDecimal;
import java.text.NumberFormat;

public class test {
    public static void main(String[] args) {
        long s = 2;
        NumberFormat currency = NumberFormat.getCurrencyInstance(); //建立货币格式化引用
        NumberFormat percent = NumberFormat.getPercentInstance();  //建立百分比格式化引用
        /**
         * BigDecimal(int)       创建一个具有参数所指定整数值的对象。
         * BigDecimal(double) 创建一个具有参数所指定双精度值的对象。
         * BigDecimal(long)    创建一个具有参数所指定长整数值的对象。
         * BigDecimal(String) 创建一个具有参数所指定以字符串表示的数值的对象。
         */
        /**
         * add(BigDecimal)        BigDecimal对象中的值相加,然后返回这个对象。
         * subtract(BigDecimal) BigDecimal对象中的值相减,然后返回这个对象。
         * multiply(BigDecimal)  BigDecimal对象中的值相乘,然后返回这个对象。
         * divide(BigDecimal)     BigDecimal对象中的值相除,然后返回这个对象。
         * toString()                将BigDecimal对象的数值转换成字符串。
         * doubleValue()          将BigDecimal对象中的值以双精度数返回。
         * floatValue()             将BigDecimal对象中的值以单精度数返回。
         * longValue()             将BigDecimal对象中的值以长整数返回。
         * intValue()               将BigDecimal对象中的值以整数返回。
         */
        BigDecimal n1 = new BigDecimal(2.3);
        System.out.println(currency.format(n1));
        BigDecimal n2 = new BigDecimal(23);
        System.out.println(currency.format(n2));
        BigDecimal n3 = new BigDecimal("25");
        System.out.println(currency.format(n3));
        BigDecimal n4 = new BigDecimal(s);
        System.out.println(currency.format(n4));
        BigDecimal n5 = new BigDecimal(0.7);
        System.out.println(currency.format(n5));
        BigDecimal n6 = new BigDecimal(1.4);

        BigDecimal r1 = n1.add(n2);
        BigDecimal r2 = n1.add(n5);
        BigDecimal r3 = n5.multiply(n1);
        BigDecimal r4 = n6.divide(n5);
        /**
         * Exception in thread "main" java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.
         * 	at java.math.BigDecimal.divide(BigDecimal.java:1693)
         * 	at test.main(test.java:26)
         */
//        BigDecimal r5 = n1.divide(n5);




        System.out.println(currency.format(r1));
        System.out.println(currency.format(r2));
        System.out.println(currency.format(r3));
        System.out.println(currency.format(r4));
//        System.out.println(currency.format(r5));

    }
}




D:\JAVA\JDK\bin\java.exe "-javaagent:D:\IDEA\idea\IntelliJ IDEA 2021.3.1\lib\idea_rt.jar=65520:D:\IDEA\idea\IntelliJ IDEA 2021.3.1\bin" -Dfile.encoding=UTF-8 -classpath D:\JAVA\JDK\jre\lib\charsets.jar;D:\JAVA\JDK\jre\lib\deploy.jar;D:\JAVA\JDK\jre\lib\ext\access-bridge-64.jar;D:\JAVA\JDK\jre\lib\ext\cldrdata.jar;D:\JAVA\JDK\jre\lib\ext\dnsns.jar;D:\JAVA\JDK\jre\lib\ext\jaccess.jar;D:\JAVA\JDK\jre\lib\ext\jfxrt.jar;D:\JAVA\JDK\jre\lib\ext\localedata.jar;D:\JAVA\JDK\jre\lib\ext\nashorn.jar;D:\JAVA\JDK\jre\lib\ext\sunec.jar;D:\JAVA\JDK\jre\lib\ext\sunjce_provider.jar;D:\JAVA\JDK\jre\lib\ext\sunmscapi.jar;D:\JAVA\JDK\jre\lib\ext\sunpkcs11.jar;D:\JAVA\JDK\jre\lib\ext\zipfs.jar;D:\JAVA\JDK\jre\lib\javaws.jar;D:\JAVA\JDK\jre\lib\jce.jar;D:\JAVA\JDK\jre\lib\jfr.jar;D:\JAVA\JDK\jre\lib\jfxswt.jar;D:\JAVA\JDK\jre\lib\jsse.jar;D:\JAVA\JDK\jre\lib\management-agent.jar;D:\JAVA\JDK\jre\lib\plugin.jar;D:\JAVA\JDK\jre\lib\resources.jar;D:\JAVA\JDK\jre\lib\rt.jar;D:\word文档\电子版练习册\JAVA\000practice\out\production\000practice;D:\word文档\电子版练习册\JAVA\000practice\src\lib\commons-io-2.11.0.jar test
¥2.30
¥23.00
¥25.00
¥2.00
¥0.70
¥25.30
¥3.00
¥1.61
¥2.00

Process finished with exit code 0

注意下面的问题

public static void main(String[] args) {
                BigDecimal bigDecimal = new BigDecimal(6.6);
                NumberFormat currencyInstance = NumberFormat.getCurrencyInstance();
                System.out.println(bigDecimal);
                System.out.println(currencyInstance.format(bigDecimal));
        }

如果这届这样使用上面的输出就是

6.59999999999999964472863211994990706443786621093756.60

在 jdk 中 double 类(float 与 int 对应)中提供了 double 与 long 转换,doubleToRawLongBits 就是将 double 转换为 long,这个方法是原始方法(底层不是 java 实现,是 c++ 实现的)。在涉及到精度计算的过程中,我们尽量使用 String 类型来进行转换。

BigDecimal 创建出来的是对象,我们不能用传统的加减乘除对其进行运算,必须使用他的方法,在我们数据库存储里,如果我们使用的是 double 或者 float 类型,需要进行来回的转换后进行计算,非常不方便。

工具类收藏

import java.math.BigDecimal;

/**
 * @Author shuaige
 * @Date 2022/6/13
 * @Version 1.0
 **/
public class BigDecimalUtils {
    public static BigDecimal doubleAdd(double v1, double v2) {
        BigDecimal b1 = new BigDecimal(Double.toString(v1));
        BigDecimal b2 = new BigDecimal(Double.toString(v2));
        return b1.add(b2);
    }
    public static BigDecimal floatAdd(float v1, float v2) {
        BigDecimal b1 = new BigDecimal(Float.toString(v1));
        BigDecimal b2 = new BigDecimal(Float.toString(v2));
        return b1.add(b2);
    }
    public static BigDecimal doubleSub(double v1, double v2) {
        BigDecimal b1 = new BigDecimal(Double.toString(v1));
        BigDecimal b2 = new BigDecimal(Double.toString(v2));
        return b1.subtract(b2);
    }
    public static BigDecimal floatSub(float v1, float v2) {
        BigDecimal b1 = new BigDecimal(Float.toString(v1));
        BigDecimal b2 = new BigDecimal(Float.toString(v2));
        return b1.subtract(b2);
    }

    public static BigDecimal doubleMul(double v1, double v2) {
        BigDecimal b1 = new BigDecimal(Double.toString(v1));
        BigDecimal b2 = new BigDecimal(Double.toString(v2));
        return b1.multiply(b2);
    }
    public static BigDecimal floatMul(float v1, float v2) {
        BigDecimal b1 = new BigDecimal(Float.toString(v1));
        BigDecimal b2 = new BigDecimal(Float.toString(v2));
        return b1.multiply(b2);
    }

    public static BigDecimal doubleDiv(double v1, double v2) {
        BigDecimal b1 = new BigDecimal(Double.toString(v1));
        BigDecimal b2 = new BigDecimal(Double.toString(v2));
        // 保留小数点后两位 ROUND_HALF_UP = 四舍五入
        return b1.divide(b2, 2, BigDecimal.ROUND_HALF_UP);
    }
    public static BigDecimal floatDiv(float v1, float v2) {
        BigDecimal b1 = new BigDecimal(Float.toString(v1));
        BigDecimal b2 = new BigDecimal(Float.toString(v2));
        // 保留小数点后两位 ROUND_HALF_UP = 四舍五入
        return b1.divide(b2, 2, BigDecimal.ROUND_HALF_UP);
    }
    /**
     * 比较v1 v2大小
     * @param v1
     * @param v2
     * @return v1>v2 return 1  v1=v2 return 0 v1<v2 return -1
     */
    public static int doubleCompareTo(double v1, double v2) {
        BigDecimal b1 = new BigDecimal(Double.toString(v1));
        BigDecimal b2 = new BigDecimal(Double.toString(v2));
        return  b1.compareTo(b2);
    }
    public static int floatCompareTo(float v1, float v2) {
        BigDecimal b1 = new BigDecimal(Float.toString(v1));
        BigDecimal b2 = new BigDecimal(Float.toString(v2));
        return  b1.compareTo(b2);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

北海冥鱼未眠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值