将 BigDecimal 转换为 double 时,会添加额外的精度。 你能建议这个吗? 例如:
BigDecimal deci= new BigDecimal(1.23456789123457E+17);
double value = deci.doubleValue();
System.out.println(value);
并且值打印- 1.23456789123456992E17
。为什么最后一个数字 7 会转换为 6992
?有什么方法可以获得转换为 double 后传递给 BigDecimal 的相同输入吗?
最佳答案
有一些有用的方法 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
,而 ...456992
后面紧接着是 。 ..457008
。因此,BigDecimal.doubleValue()
应在两个最接近的数字 ...456992
和 ...457008
之间进行选择。他们之间不存在其他双数。
实际上,您甚至不需要 BigDecimal
来进行此测试:
double value = 1.23456789123457E+17;
System.out.println(value); // prints 1.23456789123456992E17
关于java - BigDecimal 到 double 的转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29104038/