Java浮点数计算精度损失底层原理与解决方案(2)

1 /** 2 * 相除 3 * @param double1 4 * @param double2 5 * @param scale 除不尽时指定精度 6 * @return 7 */ 8 public static double div(String doubleValA, String doubleValB, int scale) { 9 BigDecimal a2 = new BigDecimal(doubleValA); 10 BigDecimal b2 = new BigDecimal(doubleValB); 11 return a2.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue(); 12 }

5. 主函数调用

1 public static void main(String[] args) { 2 String doubleValA = "3.14159267"; 3 String doubleValB = "2.358"; 4 System.out.println("add:" + add(doubleValA, doubleValB)); 5 System.out.println("sub:" + sub(doubleValA, doubleValB)); 6 System.out.println("mul:" + mul(doubleValA, doubleValB)); 7 System.out.println("div:" + div(doubleValA, doubleValB, 8)); 8 }

结果展示如下所示:

add:5.49959267
  sub:0.78359267
  mul:7.40787551586
  div:1.33231241

所以最好的方法是完全抛弃double,用string和java.math.BigDecimal。

  java遵照IEEE制定的浮点数表示法来进行float,double运算。这种结构是一种科学计数法,用符号、指数和尾数来表示,底数定为2——即把一个浮点数表示为尾数乘以2的指数次方再添上符号。具体底层如何存储以及如何进行运行请继续关注我的博客,后续我会将详情总结好的。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/d900cea04f0d58aa84de4d292fceff42.html