你的位置:首页 > 软件开发 > Java > Java中关于 BigDecimal 的一个导致double精度损失的bug

Java中关于 BigDecimal 的一个导致double精度损失的bug

发布时间:2015-04-27 14:00:27
背景 在博客 恶心的0.5四舍五入问题 一文中看到一个关于 0.5 不能正确的四舍五入的问题。主要说的是 double 转换到 BigDecimal 后,进行四舍五入得不到正确的结果:public class BigDecimalTest { publi ...

背景

     在博客 恶心的0.5四舍五入问题 一文中看到一个关于 0.5 不能正确的四舍五入的问题。主要说的是 double 转换到 BigDecimal 后,进行四舍五入得不到正确的结果:

public class BigDecimalTest {  public static void main(String[] args){    double d = 301353.05;    BigDecimal decimal = new BigDecimal(d);    System.out.println(decimal);//301353.0499999999883584678173065185546875    System.out.println(decimal.setScale(1, RoundingMode.HALF_UP));//301353.0  }}
上面我们自己写了一个工具类,实现了 double 到 BigDecimal 的“无损失”double精度的转换。方法是将小数点后有有效数字的double先转换到小数点后没有有效数字的double,然后在转换到 BigDecimal ,之后使用BigDecimal的 divide 返回之前的大小。

上面的结果看起来好像十分的完美,但是其实是存在问题的。上面我们也说到了“某些情况下可以完全不损失 double 的精度”,我们先看一个例子:

  public static void main(String[] args){    double d = 301353.05;    System.out.println(doubleToBigDecimal(d));    System.out.println(d);    System.out.println(new Double(d).toString());    System.out.println(new BigDecimal(new Double(d).toString()));    System.out.println(new BigDecimal(d));        System.out.println("=========================");    d = 301353.895898895455898954895989;    System.out.println(doubleToBigDecimal(d));    System.out.println(d);    System.out.println(new Double(d).toString());    System.out.println(new BigDecimal(new Double(d).toString()));    System.out.println(new BigDecimal(d));    System.out.println(new BigDecimal("301353.895898895455898954895989"));        System.out.println("=========================");    d = 301353.46899434;    System.out.println(doubleToBigDecimal(d));    System.out.println(d);    System.out.println(new Double(d).toString());    System.out.println(new BigDecimal(new Double(d).toString()));    System.out.println(new BigDecimal(d));        System.out.println("=========================");    d = 301353.45789666;    System.out.println(doubleToBigDecimal(d));    System.out.println(d);    System.out.println(new Double(d).toString());    System.out.println(new BigDecimal(new Double(d).toString()));    System.out.println(new BigDecimal(d));  }

 

海外公司注册、海外银行开户、跨境平台代入驻、VAT、EPR等知识和在线办理:https://www.xlkjsw.com

原标题:Java中关于 BigDecimal 的一个导致double精度损失的bug

关键词:JAVA

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。