使用BigDecimal进行精确运算(实现加减乘除运算)_java

首先我们先来看如下代码示例:

复制代码 代码如下:

public class Test_1 {
public static void main(String[] args) {
System.out.println(0.06+0.01);
System.out.println(1.0-0.42);
System.out.println(4.015*100);
System.out.println(303.1/1000);
}
}

运行结果如下
0.06999999999999999
 0.5800000000000001
 401.49999999999994
 0.30310000000000004

你认为你看错了,但结果却是是这样的。问题在哪里呢?原因在于我们的计算机是二进制的。浮点数没有办法是用二进制进行精确表示。我们的CPU表示浮点数由两个部分组成:指数和尾数,这样的表示方法一般都会失去一定的精确度,有些浮点数运算也会产生一定的误差。如:2.4的二进制表示并非就是精确的2.4。反而最为接近的二进制表示是 2.3999999999999999。浮点数的值实际上是由一个特定的数学公式计算得到的。
其实java的float只能用来进行科学计算或工程计算,在大多数的商业计算中,一般采用java.math.BigDecimal类来进行精确计算。
在使用BigDecimal类来进行计算的时候,主要分为以下步骤:
1、用float或者double变量构建BigDecimal对象。
2、通过调用BigDecimal的加,减,乘,除等相应的方法进行算术运算。
3、把BigDecimal对象转换成float,double,int等类型。
一般来说,可以使用BigDecimal的构造方法或者静态方法的valueOf()方法把基本类型的变量构建成BigDecimal对象。

复制代码 代码如下:

BigDecimal b1 = new BigDecimal(Double.toString(0.48));
BigDecimal b2 = BigDecimal.valueOf(0.48);

对于常用的加,减,乘,除,BigDecimal类提供了相应的成员方法。

复制代码 代码如下:

public BigDecimal add(BigDecimal value);//加法
public BigDecimal subtract(BigDecimal value); //减法
public BigDecimal multiply(BigDecimal value); //乘法
public BigDecimal divide(BigDecimal value); //除法

进行相应的计算后,我们可能需要将BigDecimal对象转换成相应的基本数据类型的变量,可以使用floatValue(),doubleValue()等方法。
下面是一个工具类,该工具类提供加,减,乘,除运算。

复制代码 代码如下:

public class Arith {
/**
 * 提供精确加法计算的add方法
 * @param value1 被加数
 * @param value2 加数
 * @return 两个参数的和
 */
public static double add(double value1,double value2){
BigDecimal b1 = new BigDecimal(Double.valueOf(value1));
BigDecimal b2 = new BigDecimal(Double.valueOf(value2));
return b1.add(b2).doubleValue();
}

/**
 * 提供精确减法运算的sub方法
 * @param value1 被减数
 * @param value2 减数
 * @return 两个参数的差
 */
public static double sub(double value1,double value2){
BigDecimal b1 = new BigDecimal(Double.valueOf(value1));
BigDecimal b2 = new BigDecimal(Double.valueOf(value2));
return b1.subtract(b2).doubleValue();
}

/**
 * 提供精确乘法运算的mul方法
 * @param value1 被乘数
 * @param value2 乘数
 * @return 两个参数的积
 */
public static double mul(double value1,double value2){
BigDecimal b1 = new BigDecimal(Double.valueOf(value1));
BigDecimal b2 = new BigDecimal(Double.valueOf(value2));
return b1.multiply(b2).doubleValue();
}

/**
 * 提供精确的除法运算方法div
 * @param value1 被除数
 * @param value2 除数
 * @param scale 精确范围
 * @return 两个参数的商
 * @throws IllegalAccessException
 */
public static double div(double value1,double value2,int scale) throws IllegalAccessException{
//如果精确范围小于0,抛出异常信息
if(scale<0){
  throw new IllegalAccessException("精确度不能小于0");
}
BigDecimal b1 = new BigDecimal(Double.valueOf(value1));
BigDecimal b2 = new BigDecimal(Double.valueOf(value2));
return b1.divide(b2, scale).doubleValue();
}
}

时间: 2025-01-28 05:35:40

使用BigDecimal进行精确运算(实现加减乘除运算)_java的相关文章

Android基于反射技术实现的加减乘除运算示例_Android

本文实例讲述了Android基于反射技术实现的加减乘除运算.分享给大家供大家参考,具体如下: JAVA反射机制定义: JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制. Java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类:在运行时构造任意一个类的对象:在运行时判断任意一个类所具有的成员变量和方法:在运行时调用任意一个对象的方法

C 语言简单加减乘除运算_C 语言

C语言也可以进行加减乘除运算,但是运算符号与数学中的略有不同,见下表. 加法 减法 乘法 除法 求余数 数学 + - × ÷ 无 C语言 + - * / %  加号.减号与数学中的一样,乘号.除号不同,另外C语言还多了一个求余数的运算符. 我们先来看一段代码: #include <stdio.h> #include <stdlib.h> int main() { int a=12; int b=100; float c=8.5; int m=a+b; float n=b*c; do

java,目标是控制台实现带括号的加减乘除运算

问题描述 java,目标是控制台实现带括号的加减乘除运算 1C 新手求教!麻烦大触帮我看下代码,多谢~ 第4次改(依旧错 package com.calculator;import java.io.*;import java.util.regex.*;public class calculator { public static StringBuilder first(StringBuilder s){ int ab; while(s.indexOf(""("")!

编程-C++复数的加减乘除运算

问题描述 C++复数的加减乘除运算 很多类型一样的错误,不知道哪里错了 解决方案 Complex这个类在哪里定义的?include stdio前面还有代码么 解决方案二: 复数的加减乘除及开方乘方运算复数的加减乘除及开方乘方运算用java实现复数的加减乘除运算 解决方案三: C++,C都有复数类型可以直接使用 解决方案四: c++木有复数类啊,要自己定义实现的 解决方案五: 运算符重载,轻松解决···· 解决方案六: 你的Complex类无法被编译器识别楼主你是否定义了Complex这个类?如果

数据结构 c++-求解多项式的加减乘除运算

问题描述 求解多项式的加减乘除运算 用数据结构(用面向对象方法与C++语言描述)进行多项式的加减乘除运算,请详细解答并标明注释,求教!!! 解决方案 http://blog.sina.com.cn/s/blog_786ce14d01014hcd.htmlhttp://download.csdn.net/download/wordnoword/1929685 解决方案二: 加减乘还是比较好做的,除法必须有自己定义的加法表和乘法表.除法比较难

javascript-麻烦大家帮我看一下这个js语句,加减乘除运算,只有前面的if语句能用

问题描述 麻烦大家帮我看一下这个js语句,加减乘除运算,只有前面的if语句能用 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 无标题文档 function abc(x,y,z,n) { var x,y,n;//定义变量 //输入第一个数字 x=window.p

简单工厂模式--加减乘除运算

下面基于简单的<加减乘除运算>实例来讲讲实用简单工厂模式:<备注:以后根据认识的加深,可以添加和修改内容> 需求分析:希望程序提供"加减乘除"四种功能. 功能分析:四种功能都是并列的,相互独立的. 拓展分析:很有可能拓展新的功能,比如"开根运算". 如何设计: 1.根据"功能分析"可以将四种功能都归并一个父类出来,然后创建四个子类继承它,并且提供空的方法(OC中模拟抽象方法或者虚函数),这四个子类分别都要继承并重写实现这个

DSP中浮点转定点运算--定点数的加减乘除运算_C 语言

3.定点数的加减乘除运算 简单的说,各种运算的原则就是先把待运算的数据放大一定的倍数,在运算的过程中使用的放大的数据,在最终需要输出结果的时候再调整回去. 举个例来说,有如下运算: 复制代码 代码如下: - // coefs1 = 0.023423; coefs2=0.2131 float coefs1,coefs2; int result; - result = 34* coefs1+72* coefs2; - 代码的意思是,该模块需要输出一个整型的结果,但计算的过程中有浮点的运算.如果在定点

Android基于反射技术实现的加减乘除运算示例

本文实例讲述了Android基于反射技术实现的加减乘除运算.分享给大家供大家参考,具体如下: JAVA反射机制定义: JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法:这种动态获取的信息以及动态调用对象的方法的功能称为java语言的反射机制. Java反射机制主要提供了以下功能: 在运行时判断任意一个对象所属的类:在运行时构造任意一个类的对象:在运行时判断任意一个类所具有的成员变量和方法:在运行时调用任意一个对象的方法