从java BigDecimal转换为double的精度丢失
我正在使用一个完全基于双精度的应用程序,并且在将字符串解析为双精度的实用程序方法中遇到了麻烦。我找到了一个修复程序,其中使用BigDecimal进行转换可以解决问题,但是当我将BigDecimal转换回双精度时,会引发另一个问题:我丢失了几个精度位置。例如:
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
格式化的双精度表示它在第三位之后丢失了精度(应用程序需要那些较低的精度位置)。
如何获取 BigDecimal 来保留这些额外的精度位置?
谢谢!
赶上这篇文章后更新。有几个人提到这超出了双精度数据类型的精度。除非我错误地阅读了这个参考:http://java.sun.com/docs/books/jls/third_edition/html/typesValues.html#4.2.3 那么双基元的最大指数值为Emax = 2K-1-1,标准实现具有K = 11。那么,最大指数应该是511,不是吗?