将BigDecimal转换为double时,会增加额外的精度。 你能建议吗? 对于Ex:
BigDecimal deci= new BigDecimal(1.23456789123457E+17);
double value = deci.doubleValue();
System.out.println(value);
值打印- 1.23456789123456992E17
。为什么最后一位数字7被转换为6992
?在转换为double后,有什么方法可以获得我传递给BigDecimal的相同输入吗?
答案 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