我正在使用完全基于双精度的应用程序,并且在将字符串解析为双精度的一种实用程序方法中遇到了问题。我发现修复了使用BigDecimal进行转换的问题,但在我将BigDecimal转换回双精度时引发了另一个问题:我失去了几个精度。例如:从java 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 那么双基元的最大指数值为E max = 2 K-1 -1,并且标准实现具有K = 11。所以,最大指数应该是511,不是?
差不多吧;改变舍入模式,你已经解决了OP的问题 – Anon 2011-04-21 21:12:26
@Anon:你在说什么?没有使用'double'来解决OP的问题。 – WhiteFang34 2011-04-21 21:17:35
查看我的答案,或重读OP的问题,以了解他/她失去9的 – Anon 2011-04-21 21:28:36