将BigDecimal转换为double

时间:2015-03-17 16:05:27

标签: java math floating-point precision bigdecimal

将BigDecimal转换为double时,会增加额外的精度。 你能建议吗? 对于Ex:

BigDecimal deci= new BigDecimal(1.23456789123457E+17);
double value = deci.doubleValue();
System.out.println(value);

值打印- 1.23456789123456992E17。为什么最后一位数字7被转换为6992?在转换为double后,有什么方法可以获得我传递给BigDecimal的相同输入吗?

1 个答案:

答案 0 :(得分:2)

有一些有用的方法Math.nextUp()Math.nextDown()可以帮助您调查此问题:

BigDecimal deci= new BigDecimal(1.23456789123457E+17);
double value = deci.doubleValue();
System.out.println(value);
System.out.println(Math.nextDown(value));
System.out.println(Math.nextUp(value));

输出结果为:

1.23456789123456992E17
1.23456789123456976E17
1.23456789123457008E17

正如您所看到的,双重号码...456976紧跟着...456992,紧随其后的是...457008。因此,BigDecimal.doubleValue()应在两个最接近的数字...456992...457008之间进行选择。他们之间不存在其他双重号码。

实际上,您甚至不需要BigDecimal进行此测试:

double value = 1.23456789123457E+17;
System.out.println(value); // prints 1.23456789123456992E17