【发布时间】:2011-04-21 20:45:07
【问题描述】:
我正在使用一个完全基于双精度的应用程序,并且在一种将字符串解析为双精度的实用程序方法中遇到了问题。我找到了一个解决方法,使用 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吧?
【问题讨论】:
标签: java floating-point double precision bigdecimal