Java编程,用什么数据类型表示价格?

在Java中,float和double都表示浮点型数,所表示的浮点数是近似值,而不是精确的值,所以,这两种数据类型不适合作为价格的数据类型。Java语言提供另外一种数据类型BigDecimal,可以用来表示精确的浮点数。

package com.zhhvip;

import java.math.BigDecimal;

public class Test {

    public static void main(String[] args) {
        double d1 = 20.15;
        double d2 = 10.10;
        System.out.println("double类型的运行结果:"+(d1-d2));

        BigDecimal bigDecimal1 =  BigDecimal.valueOf(d1);
        BigDecimal bigDecimal2 =  BigDecimal.valueOf(d2);
        System.out.println("BigDecimal类型的运行结果:"+(bigDecimal1.subtract(bigDecimal2)));

//        错误的使用方式
        BigDecimal bigDecimal3 = new BigDecimal(d1);
        BigDecimal bigDecimal4 = new BigDecimal(d2);
        System.out.println("BigDecimal类型错误使用方式的运行结果:"+(bigDecimal3.subtract(bigDecimal4)));

//        正确的使用方式
        BigDecimal bigDecimal5 = new BigDecimal("20.15");
        BigDecimal bigDecimal6 = new BigDecimal("10.10");
        System.out.println("BigDecimal类型正确使用方式的运行结果:"+(bigDecimal5.subtract(bigDecimal6)));

    }
}

运行结果:

注意,new 一个BigDecimal时候,只有参数为String类型时候才能够正确表示,为什么BigDecimal.valueOf()又可以呢?因为BigDecimal.valueOf()本质上也是调用了参数类型为String的构造方法。

    public static BigDecimal valueOf(double val) {
        // Reminder: a zero double returns '0.0', so we cannot fastpath
        // to use the constant ZERO.  This might be important enough to
        // justify a factory approach, a cache, or a few private
        // constants, later.
        return new BigDecimal(Double.toString(val));
    }
原文地址:https://www.cnblogs.com/zhvip/p/12766927.html