zoukankan      html  css  js  c++  java
  • BigDecimal相关——高精度数的处理

    java.math.BigDecmal.(java.math.BigInteger)

    从MySQL数据库中读取出decimal(4,2)类型的数据进行累加统计时,会出现精度问题。

    对于在java中处理数字运算,如果涉及到小数点后多位运算,则会出现精度问题。

    比如:

      190.3在加法中就会变成190.29999994这样的异常精度数。

    这是因为float与double类型本身就是不准确。只能用来做科学计算或工程计算。在商业计算中我们要用BigDecimal。

    BigDecimal一共有4个构造方法,其中两个是:

    BigDecimal(double val); Translates a double into a BigDecimal.

    BigDecimal(String val); Translates the String repre sentation of a BigDecimal into a BigDecimal.

    如果我们需要精确计算,要用String来构造BigDecimal。

    可以自己写一个工具类  Arith()  ——摘抄自新浪blogs。

     1 /**
     2  * 
     3  */
     4 package com.clarion.worksys.util;
     5 
     6 import java.math.BigDecimal;
     7 
     8 /**
     9  * @author weng_zhangchu
    10  *
    11  */
    12 public final class Arith {// 这个类不能实例化
    13      
    14      private static final int DEF_DIV_SCALE = 2;
    15      // 默认除法运算精度
    16      private Arith() {
    17      }
    18      
    19      public static double add(double v1, double v2) {
    20       BigDecimal b1 = new BigDecimal(Double.toString(v1));
    21       BigDecimal b2 = new BigDecimal(Double.toString(v2));
    22       return b1.add(b2).doubleValue();
    23      }
    24      
    25      public static double sub(double v1, double v2) {
    26       BigDecimal b1 = new BigDecimal(Double.toString(v1));
    27       BigDecimal b2 = new BigDecimal(Double.toString(v2));
    28       return b1.subtract(b2).doubleValue();
    29      }
    30      
    31      public static double mul(double v1, double v2) {
    32       BigDecimal b1 = new BigDecimal(Double.toString(v1));
    33       BigDecimal b2 = new BigDecimal(Double.toString(v2));
    34       return b1.multiply(b2).doubleValue();
    35      }
    36      
    37      public static double div(double v1, double v2) {
    38       return div(v1, v2, DEF_DIV_SCALE);
    39      }
    40      
    41      public static double div(double v1, double v2, int scale) {
    42       if (scale < 0) {
    43        throw new IllegalArgumentException(
    44        "The scale must be a positive integer or zero");
    45       }
    46       BigDecimal b1 = new BigDecimal(Double.toString(v1));
    47       BigDecimal b2 = new BigDecimal(Double.toString(v2));
    48       return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
    49      }
    50      
    51      public static double round(double v, int scale) {
    52       if (scale < 0) {
    53        throw new IllegalArgumentException(
    54        "The scale must be a positive integer or zero");
    55       }
    56       BigDecimal b = new BigDecimal(Double.toString(v));
    57       BigDecimal one = new BigDecimal("1");
    58       return b.divide(one, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
    59      }
    60 }


  • 相关阅读:
    解决安装vmware-tools出现的“The path "" is not a valid path to the 3.2.0-4-amd64 kernel headers”问题
    页面布局
    CSS属性/尺寸/边框/背景 超级链接
    前端
    索引
    Pymysql
    单表查询,多表查询,子查询
    表的完整性约束
    文件库,文件表,记录的增删改查
    IO多路复用,数据库mysql
  • 原文地址:https://www.cnblogs.com/sevenology/p/3022407.html
Copyright © 2011-2022 走看看