精度更高的double类型计算工具类(借助BigDecimal类型)

/**
  * 提供精確的加法運算
  * @param args
  */
  public static double add(double v1, double v2) {
    BigDecimal b1 = new BigDecimal(Double.toString(v1));
    BigDecimal b2 = new BigDecimal(Double.toString(v2));
    return b1.add(b2).doubleValue();
  }   

  /**
  * 提供了精確的減法運算
  *
  * @param args
  */
  public static double sub(double v1, double v2) {
    BigDecimal b1 = new BigDecimal(Double.toString(v1));
    BigDecimal b2 = new BigDecimal(Double.toString(v2));
    return b1.subtract(b2).doubleValue();
  }   

  /**
  * 提供了精確的乘法運算
  * @param args
  */
  public static double mul(double v1, double v2) {
    BigDecimal b1 = new BigDecimal(Double.toString(v1));
    BigDecimal b2 = new BigDecimal(Double.toString(v2));
    return b1.multiply(b2).doubleValue();
  }   

  /**
  * 提供了(相对)精确的除法运算,當发生除不尽的情況時,精确到
  * 小数点以后110位
  * @param args
  */
  public static double div(double v1, double v2) {
    return div(v1, v2, DEF_DIV_SCALE);
  }   

  /**
  * 提供了(相对)精确的除法運算,当发生除不尽的情況時,由scale参数指定
  * 精度,以后的数字四捨五入
  * @param args
  */
  public static double div(double v1, double v2, int scale) {
    if (scale < 0) {
      throw new IllegalArgumentException(
        "The scale must be a positive integer or zero");
     }
    BigDecimal b1 = new BigDecimal(Double.toString(v1));
    BigDecimal b2 = new BigDecimal(Double.toString(v2));
    return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
  }   

  /**
  * 提供了精確的小數位四捨五入處理
  * @param args
  */   

  public static double round(double v, int scale) {
    if (scale<0) {
      throw new IllegalArgumentException("The scale must be a positive integer or zero");
    }
    BigDecimal b = new BigDecimal(Double.toString(v));
    BigDecimal one = new BigDecimal("1");
    return b.divide(one, scale, BigDecimal.ROUND_HALF_DOWN).doubleValue();
  }   

  public static void main(String[] args) {
    System.out.println(add(1.2321231, 3.7865765));
    System.out.println(sub(6.4523423, 1.2321231));
    System.out.println(mul(6.4523423, 3.7865765));
    System.out.println(div(6.4523423, 3.7865765, 5));
    System.out.println(round(3.7865765, 5));
  }   }  
JAVA中float为四个字节,double为八个字节,float--->double时候会补位,如果这里补位不出现误差的话应该可以实现。你先将float类型数据包装成BigDecimal数据,然后调用其floatValue()方法可以实现。

原文地址:https://www.cnblogs.com/javahr/p/8320665.html

时间: 2024-10-31 19:03:49

精度更高的double类型计算工具类(借助BigDecimal类型)的相关文章

精确计算工具类,提供加减乘除的计算

package com.ljq.util; import java.math.BigDecimal; /** * 精确计算工具类,提供加减乘除的计算 * * @author jqlin */ public class CompuUtils { /**小数点后保留的位数*/ public final static int SCALE = 5; /** 0 */ public final static int ZERO = 0; /** * BigDecimal大小比较 * * @param a *

常用类型转换方法工具类

功能:十六进制字符串与字节数组互转.字符转字节.Blob类型转字节数组.阿拉伯数字转中文小写 1 import java.io.BufferedInputStream; 2 import java.io.IOException; 3 import java.sql.Blob; 4 5 /** 6 * 常用类型转换方法工具类 7 */ 8 public class ConvertUtil { 9 10 /** 11 * 字节数组转换为十六进制字符串. 12 * @param src 13 * @r

java精确计算工具类

import java.math.BigDecimal; import java.math.RoundingMode; import java.math.BigDecimal; import java.text.DecimalFormat; import org.springframework.stereotype.Component; /** * 工具类 - 运算 */ @Component public class ArithUtils { // 默认除法运算精度 private stati

在linux内核中获得比jiffies精度更高的时间值【转】

转自:http://blog.chinaunix.net/uid-20672257-id-2831219.html 内核一般通过jiffies值来获取当前时间.尽管该数值表示的是自上次系统启动到当前的时间间隔,但因为驱动程序的生命期只限于系统的运行期 (uptime),所以也是可行的.驱动程序利用jiffies的当前值来计算不同事件间的时间间隔. 硬件给内核提供一个系统定时器用以计算和管理时间,内核通过编程预设系统定时器的频率,即节拍率(tick rate),每一个周期称作一个tick(节拍).

double类型转换为int类型四舍五入工具类

package com.qiyuan.util; import java.math.BigDecimal; import java.text.DecimalFormat; public class GetInt { /** * (1)四舍五入把double转化int整型,0.5进一,小于0.5不进一 * @param number * @return */ public static int getInt(double number){ BigDecimal bd=new BigDecimal(

JAVA简单精确计算工具类

1 public class ArithUtil { 2 3 // 默认除法运算精度 4 private static final int DEF_DIV_SCALE = 10; 5 6 private ArithUtil() { 7 8 } 9 10 /** 11 * 提供精确的加法运算. 12 * 13 * @param v1 14 * 被加数 15 * @param v2 16 * 加数 17 * @return 两个参数的和 18 */ 19 public static double a

精确的double加减乘除运算工具类

import java.math.BigDecimal; /** * 精确的double加减乘除运算 * @author cyf * */ public class DoubleUtil { /** * 提供精确的加法运算. * * @param v1 * 被加数 * @param v2 * 加数 * @return 两个参数的和 */ public static double add(double v1, double v2) { BigDecimal b1 = new BigDecimal(

日期和字符串类型相互转换工具类

import org.apache.commons.lang3.StringUtils; import org.joda.time.DateTime; import org.joda.time.format.DateTimeFormat; import org.joda.time.format.DateTimeFormatter; import java.util.Date; public class DateTimeUtil { //自定义格式 public static final Stri

打开SQL Server配置管理器,“无法连接到WMI提供程序,您没有权限或者该服务器无法访问。请注意,您只能使用SQL Server配置管理器来管理SQL Server 2005和更高版本的服务器。无效类[0x80041010]

我安装的版本是SQL Server2008 ,在打开SQL Server配置管理器时,遇到如图所示问题: 按照网上提供的常用的3种方法均不奏效: 1.检查一下 windows下的system32 中是否有framedyn.dll这个系统文件,如果没有到system32 下的wbem文件中拷贝framedyn.dll到system32 目录下 我的system32 中有framedyn.dll,反而是wbem文件中没有,于是复制了一份到wbem中,然并卵! 2. 1 右击“我的电脑”-->“管理”