我正在使用完全基于双精度的应用程序,并且在一个将字符串解析为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()));
}
}
Run Code Online (Sandbox Code Playgroud)
这会产生以下输出:
$ java test
big decimal: 299792.457999999984
double: 299792.458
double formatted: 299792.4580000000
Run Code Online (Sandbox Code Playgroud)
格式化的double表明它在第三位之后失去了精度(应用程序需要较低的精度位置).
如何让BigDecimal保留那些额外的精度位置?
谢谢!
追上这篇文章后更新.有人提到这超出了双数据类型的精度.除非我错误地阅读此引用:http: //java.sun.com/docs/books/jls/third_edition/html/typesValues.html#4.2.3 然后double原语的最大指数值为E max = 2 K-1 -1,标准实现K = 11.那么,最大指数应该是511,不是吗?