Java double转decimal_Java中Double与BigDecimal的相互转换

今天写代码过程中,发现一个Double的变量通过new BigDecimal(Double d)转换为BigDecimal时,有效数字改变了,如下:

public class BigDecimalTest {

    public static void main(String[] arg) {

        String s1 = "123.45";

        Double d1 = new Double(s1);     //使用String类型的形参构造BigDecimal

        BigDecimal bg1 = new BigDecimal(d1);     //使用Double类型的形参构造BigDecimal

        BigDecimal bg2 = new BigDecimal(s1);

        System.out.println("bg1 = "+bg1);

        System.out.println("bg2 = "+bg2);

    }

}

输出:

bg1 = 123.4500000000000028421709430404007434844970703125

bg2 = 123.45

同样大小的Double数,以字符串形参的方式构造BigDecimal就能得到同样精度。而使用Double构造就会导致精度改变。事实上,按照官方API文档,推荐使用String形参的方式将float、double转换为BidDecimal。
文档原文:For values other than float and double NaN and ±Infinity, this constructor is compatible with the values returned by Float.toString(float) and Double.toString(double). This is generally the preferred way to convert a float or double into a BigDecimal, as it doesn‘t suffer from the unpredictability of the BigDecimal(double) constructor。
不止如此,还有以下情况:

public class BigDecimalTest {

    public static void main(String[] arg) {

        String s1 = "123.45";

        String s2 = "123.450";

        Double d1 = new Double(s1);

        Double d2 = new Double(s2);

        BigDecimal bg1 = new BigDecimal(s1);

        BigDecimal bg2 = new BigDecimal(s2);

        System.out.println("d1.equals(d2): "+d1.equals(d2));

        System.out.println("bg1.equals(bg2): "+bg1.equals(bg2));

    }

}

输出:

d1.equals(d2): true

bg1.equals(bg2): false

同样大小的小数,有效数字不同情况下,Double类型的大小比较结果是相等的,符合我们的实际计算。但是分别转换成BigDecimal后再比较大小,得到不相等的结果。

BigDecimal类型和double类型的值相互转换

1.BigDecimal转double,使用BigDecimal类里面doubleValue()方法:

BigDecimal latitude = 39.97268600;
double latitudeDou = latitude.doubleValue()

2.double转BigDecimal,使用BigDecimal类里面valueOf()方法:

double latitudeDou = 39.97268600;
BigDecimal latitude = BigDecimal.valueOf(latitudeDou);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Archie_java

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

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

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

打赏作者

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

抵扣说明:

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

余额充值