数字精确运算BigDecimal常用方法

import java.math.BigDecimal;

public class Arith {

/**

* 由于Java的简单类型不能够精确的对浮点数进行运算,这个工具类提供精

* 确的浮点数运算,包括加减乘除和四舍五入。

*/

//默认除法运算精度

private static final int DEF_DIV_SCALE = 10;

//这个类不能实例化

private Arith(){

}

/**

* 提供精确的加法运算。

* @param v1 被加数

* @param v2 加数

* @return 两个参数的和

*/

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 v1 被减数

* @param v2 减数

* @return 两个参数的差

*/

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 v1 被乘数

* @param v2 乘数

* @return 两个参数的积

*/

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();

}

/**

* 提供(相对)精确的除法运算,当发生除不尽的情况时,精确到

* 小数点以后10位,以后的数字四舍五入。

* @param v1 被除数

* @param v2 除数

* @return 两个参数的商

*/

public static double div(double v1,double v2){

return div(v1,v2,DEF_DIV_SCALE);

}

/**

* 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指

* 定精度,以后的数字四舍五入。

* @param v1 被除数

* @param v2 除数

* @param scale 表示表示需要精确到小数点以后几位。

* @return 两个参数的商

*/

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 v 需要四舍五入的数字

* @param scale 小数点后保留几位

* @return 四舍五入后的结果

*/

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_UP).doubleValue();

}

/**

* 提供精确的类型转换(Float)

* @param v 需要被转换的数字

* @return 返回转换结果

*/

public static float convertsToFloat(double v){

BigDecimal b = new BigDecimal(v);

return b.floatValue();

}

/**

* 提供精确的类型转换(Int)不进行四舍五入

* @param v 需要被转换的数字

* @return 返回转换结果

*/

public static int convertsToInt(double v){

BigDecimal b = new BigDecimal(v);

return b.intValue();

}

/**

* 提供精确的类型转换(Long)

* @param v 需要被转换的数字

* @return 返回转换结果

*/

public static long convertsToLong(double v){

BigDecimal b = new BigDecimal(v);

return b.longValue();

}

/**

* 返回两个数中大的一个值

* @param v1 需要被对比的第一个数

* @param v2 需要被对比的第二个数

* @return 返回两个数中大的一个值

*/

public static double returnMax(double v1,double v2){

BigDecimal b1 = new BigDecimal(v1);

BigDecimal b2 = new BigDecimal(v2);

return b1.max(b2).doubleValue();

}

/**

* 返回两个数中小的一个值

* @param v1 需要被对比的第一个数

* @param v2 需要被对比的第二个数

* @return 返回两个数中小的一个值

*/

public static double returnMin(double v1,double v2){

BigDecimal b1 = new BigDecimal(v1);

BigDecimal b2 = new BigDecimal(v2);

return b1.min(b2).doubleValue();

}

/**

* 精确对比两个数字

* @param v1 需要被对比的第一个数

* @param v2 需要被对比的第二个数

* @return 如果两个数一样则返回0,如果第一个数比第二个数大则返回1,反之返回-1

*/

public static int compareTo(double v1,double v2){

BigDecimal b1 = new BigDecimal(v1);

BigDecimal b2 = new BigDecimal(v2);

return b1.compareTo(b2);

}

}

版权声明:本文为博主http://www.zuiniusn.com原创文章,未经博主允许不得转载。

时间: 2024-12-04 13:42:43

数字精确运算BigDecimal常用方法的相关文章

数字精确运算BigDecimal经常用法

import java.math.BigDecimal; public class Arith { /** * 因为Java的简单类型不可以精确的对浮点数进行运算,这个工具类提供精 * 确的浮点数运算,包含加减乘除和四舍五入. */ //默认除法运算精度 private static final int DEF_DIV_SCALE = 10; //这个类不能实例化 private Arith(){ } /** * 提供精确的加法运算. * @param v1 被加数 * @param v2 加数

精确运算--BigDecimal

工具类 ,直接就可以使用,对于float和double的进行加减乘除长生的误差的解决办法. import java.math.BigDecimal; public class Arith { // 默认除法运算精度 private static final int DEF_DIV_SCALE = 10; // 这个类不能实例化 private Arith() { } /** * * 提供精确的加法运算. * * @param v1 * 被加数 * * @param v2 * 加数 * * @re

使用BigDecimal进行精确运算

使用BigDecimal进行精确运算 首先我们先来看如下代码示例: 1 public class Test_1 { 2 public static void main(String[] args) { 3 System.out.println(0.06+0.01); 4 System.out.println(1.0-0.42); 5 System.out.println(4.015*100); 6 System.out.println(303.1/1000); 7 } 8 9 } 运行结果如下.

JS/PHP 浮点数精确运算

php浮点数精确运算 bc是Binary Calculator的缩写.bc*函数的参数都是操作数加上一个可选的 [int scale],比如string bcadd(string $left_operand, string $right_operand[, int $scale]),如果scale没有提供,就用bcscale的缺省值.这里大数直接用一个由0-9组成的string表示,计算结果返回的也是一个 string. bcadd — 将两个高精度数字相加bccomp — 比较两个高精度数字,

4个线程例子,2个线程对同一数字加法运算另外2个线程对同一共享数字减法运算

package com.saic.grape.controller; public class Data { private int j = 0; /** * 加法 */ public synchronized void inc() { j++; System.out.println("inc 加法运算>>" + j); } /** * 减法 */ public synchronized void dec() { j--; System.out.println("

Java精确运算(BigDecimal)

(1).浮点数精确计算 胜利油田三流合一项目中一直存在一个问题,就是每次报表统计的物资金额和实际的金额要差那么几分钱,和实际金额不一致,让客户觉得总是不那么舒服,原因是因为我们使用java的浮点类型double来定义物资金额,并且在报表统计中我们经常要进行一些运算,但Java中浮点数(double.float)的计算是非精确计算,请看下面一个例子: System.out.println(0.05 + 0.01); System.out.println(1.0 - 0.42); System.ou

java的数字精确计算问题-BigDecimal

java的数字运算,偶尔喝出现精度的问题,以下阐述的 java的BigDecimal类的使用. 例如: System.out.println(0.9+0.3); 结果1.2 System.out.println(1.9+0.3); 结果2.1999999999999997 System.out.println(1.9+0.4); 结果2.3 java为了让float或者double类型能够精确的计算,提供了BigDecimal类. 示例如下: public static BigDecimal g

使用Java BigDecimal进行精确运算

首先我们先来看如下代码示例: 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);     }      }

Java中的简单浮点数类型float和double不能够进行精确运算

在java中,简单的浮点类型float和double是不能够进行运算.我们先看下面的两个程序代码: 代码一: import java.util.Scanner; class Circle { double radius; static final double PI=3.14; public Circle(){this.radius=0;} public Circle(double r){this.radius=r;} public double getArea(){return PI*this