我正在使用完全基于double的应用程序,并且在一个解析字符串为double的实用程序方法中遇到麻烦。我找到了一个解决方案,即使用BigDecimal进行转换可以解决问题,但是当我将BigDecimal转换回double时,又会出现另一个问题:我失去了几个精度位。例如:
import java.math.BigDecimal;
import java.text.DecimalFormat;
public class test {
public static void main(String [] args){
String num = "299792.457999999984";
BigDecimal val = new BigDecimal(num);
System.out.println("big decimal: " + val.toString());
DecimalFormat nf = new DecimalFormat("#.0000000000");
System.out.println("double: "+val.doubleValue());
System.out.println("double formatted: "+nf.format(val.doubleValue()));
}
}
这将产生以下输出:
$ java test
big decimal: 299792.457999999984
double: 299792.458
double formatted: 299792.4580000000
这个格式化后的double值在第三位后就失去了精度(应用程序需要更高的精度位数)。
我该如何让 BigDecimal 保持这些额外的精度位数呢?
谢谢!
更新:在阅读完本帖后,有几个人提到这超出了 double 数据类型的精度。除非我错误地阅读了这份参考文档: http://java.sun.com/docs/books/jls/third_edition/html/typesValues.html#4.2.3 然而,double 原始数据类型具有指数最大值 Emax = 2K-1-1,并且标准实现中 K=11。因此,最大指数应该是511,不是吗?