java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言, 是由 Sun Microsystems 公司于 1995 年 5 月推出的 Java 程序设计语言和 Java 平台 (即 JavaEE(j2ee), JavaME(j2me), JavaSE(j2se)) 的总称
下面小编就为大家带来一篇 java 中 double 类型运算结果异常的解决方法小编觉得挺不错的, 现在就分享给大家, 也给大家做个参考一起跟随小编过来看看吧
问题:
对两个 double 类型的值进行运算, 有时会出现结果值异常的问题比如:
- System.out.println(19.99 + 20);
- System.out.println(1.0 - 0.66);
- System.out.println(0.033 * 100);
- System.out.println(12.3 / 100);
输出:
- 39.989999999999995
- 0.33999999999999997
- 3.3000000000000003
- 0.12300000000000001
解决方法:
Java 中的简单浮点数类型 float 和 double 不能够进行运算, 因为大多数情况下是正常的, 但是偶尔会出现如上所示的问题这个问题其实不是 JAVA 的 bug, 因为计算机本身是二进制的, 而浮点数实际上只是个近似值, 所以从二进制转化为十进制浮点数时, 精度容易丢失, 导致精度下降
要保证精度就要使用 BigDecimal 类, 而且不能直接从 double 直接转 BigDecimal, 要将 double 转 string 再转 BigDecimal 也就是不能使用 BigDecimal(double val) 方法, 你会发现没有效果要使用 BigDecimal(String val) 方法具体例子如下所示
double 类型四则运算例子:
1 相加
- public static double add(double a1, double b1) {
- BigDecimal a2 = new BigDecimal(Double.toString(a1));
- BigDecimal b2 = new BigDecimal(Double.toString(b1));
- return a2.add(b2).doubleValue();
- }
2 相减
- public static double sub(double a1, double b1) {
- BigDecimal a2 = new BigDecimal(Double.toString(a1));
- BigDecimal b2 = new BigDecimal(Double.toString(b1));
- return a2.subtract(b2).doubleValue();
- }
3 相乘
- public static double mul(double a1, double b1) {
- BigDecimal a2 = new BigDecimal(Double.toString(a1));
- BigDecimal b2 = new BigDecimal(Double.toString(b1));
- return a2.multiply(b2).doubleValue();
- }
4 相除
- public static double div(double a1, double b1, int scale) {
- if (scale < 0) {
- throw new IllegalArgumentException("error");
- }
- BigDecimal a2 = new BigDecimal(Double.toString(a1));
- BigDecimal b2 = new BigDecimal(Double.toString(b1));
- return a2.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
- }
scale 参数为除不尽时, 指定精度
来源: http://www.phperz.com/article/18/0218/359192.html