package com.tht.common.arithmetic.math;
import java.math.BigDecimal;
import java.text.DecimalFormat;
/**
* Created by IntelliJ IDEA.
* User: T.H.T
* Date: 2010-11-2
* Time: 17:18:13
* To change this template use File | Settings | File Templates.
* 由于Java中的double,float不能精确的进行运算,所以用些工具类来代替常用的 加,减,乘,除
*/
public class ThtBigDecimal {
/**
* 默认的除法精度为两位
*/
public static final int DEF_DIV_SCALE=2;
/**
* 精确的加法运算
* @param d1 第一个加数
* @param d2 第二个加数
* @return double 型结果
*/
public static BigDecimal add(double d1,double d2){
BigDecimal b1=new BigDecimal(Double.toString(d1));
BigDecimal b2=new BigDecimal(Double.toString(d2));
return b1.add(b2);
}
/**
* 精确的加法运算
* @param d1 第一个加数
* @param d2 第二个加数
* @return double 型结果
*/
public static BigDecimal add(int d1,int d2){
BigDecimal b1=new BigDecimal(Integer.toString(d1));
BigDecimal b2=new BigDecimal(Integer.toString(d2));
return b1.add(b2);
}
/**
* 精确的加法运算
* @param d1 第一个加数
* @param d2 第二个加数
* @return double 型结果
*/
public static BigDecimal add(String d1,String d2){
BigDecimal b1=new BigDecimal(d1);
BigDecimal b2=new BigDecimal(d2);
return b1.add(b2);
}
/**
* 精确的减法运算
* @param d1 被减数
* @param d2 减数
* @return double 型结果
*/
public static BigDecimal sub(double d1,double d2){
BigDecimal b1=new BigDecimal(Double.toString(d1));
BigDecimal b2=new BigDecimal(Double.toString(d2));
return b1.subtract(b2);
}
/**
* 精确的减法运算
* @param d1 被减数
* @param d2 减数
* @return double 型结果
*/
public static BigDecimal sub(int d1,int d2){
BigDecimal b1=new BigDecimal(Integer.toString(d1));
BigDecimal b2=new BigDecimal(Integer.toString(d2));
return b1.subtract(b2);
}
/**
* 精确的减法运算
* @param d1 被减数
* @param d2 减数
* @return double 型结果
*/
public static BigDecimal sub(String d1,String d2){
BigDecimal b1=new BigDecimal(d1);
BigDecimal b2=new BigDecimal(d2);
return b1.subtract(b2);
}
/**
* 精确的乘法运算
* @param d1 因数一
* @param d2 因数二
* @return double 型结果
*/
public static BigDecimal mul(double d1,double d2){
BigDecimal b1=new BigDecimal(Double.toString(d1));
BigDecimal b2=new BigDecimal(Double.toString(d2));
return b1.multiply(b2);
}
/**
* 精确的乘法运算
* @param d1 因数一
* @param d2 因数二
* @return double 型结果
*/
public static BigDecimal mul(int d1,int d2){
BigDecimal b1=new BigDecimal(Integer.toString(d1));
BigDecimal b2=new BigDecimal(Integer.toString(d2));
return b1.multiply(b2);
}
/**
* 精确的乘法运算
* @param d1 因数一
* @param d2 因数二
* @return double 型结果
*/
public static BigDecimal mul(String d1,String d2){
BigDecimal b1=new BigDecimal(d1);
BigDecimal b2=new BigDecimal(d2);
return b1.multiply(b2);
}
/**
* 精确的除法运算,默认保留两位小数,指定小数精确4位数如:div(65.22,2.13,4); div(double d1,double d2,int scale)
* @param d1 被除数
* @param d2 除数
* @return double 型结果
*/
public static BigDecimal div(double d1,double d2){
return div( d1, d2,DEF_DIV_SCALE);
}
/**
* 精确的除法运算,默认保留两位小数,指定小数精确4位数如:div(65.22,2.13,4); div(double d1,double d2,int scale)
* @param d1 被除数
* @param d2 除数
* @return double 型结果
*/
public static BigDecimal div(int d1,int d2){
return div( d1, d2,DEF_DIV_SCALE);
}
/**
* 精确的除法运算,默认保留两位小数,指定小数精确4位数如:div(65.22,2.13,4); div(double d1,double d2,int scale)
* @param d1 被除数
* @param d2 除数
* @return double 型结果
*/
public static BigDecimal div(String d1,String d2){
return div( d1, d2,DEF_DIV_SCALE);
}
/**
* 精确的除法运算
* @param d1 被除数
* @param d2 除数
* @param scale 小数点精确的位数
* @return double 型结果
*/
public static BigDecimal div(double d1,double d2,int scale){
if(scale<0){
throw new IllegalArgumentException("The scale must be positive integer or zero");
}
BigDecimal b1=new BigDecimal(Double.toString(d1));
BigDecimal b2=new BigDecimal(Double.toString(d2));
return b1.divide(b2,scale,BigDecimal.ROUND_HALF_UP);
}
/**
* 精确的除法运算
* @param d1 被除数
* @param d2 除数
* @param scale 小数点精确的位数
* @return double 型结果
*/
public static BigDecimal div(int d1,int d2,int scale){
if(scale<0){
throw new IllegalArgumentException("The scale must be positive integer or zero");
}
BigDecimal b1=new BigDecimal(Integer.toString(d1));
BigDecimal b2=new BigDecimal(Integer.toString(d2));
return b1.divide(b2,scale,BigDecimal.ROUND_HALF_UP);
}
/**
* 精确的除法运算
* @param d1 被除数
* @param d2 除数
* @param scale 小数点精确的位数
* @return double 型结果
*/
public static BigDecimal div(String d1,String d2,int scale){
if(scale<0){
throw new IllegalArgumentException("The scale must be positive integer or zero");
}
BigDecimal b1=new BigDecimal(d1);
BigDecimal b2=new BigDecimal(d2);
return b1.divide(b2,scale,BigDecimal.ROUND_HALF_UP);
}
/**
* 精确的四舍五入
* @param d 需要精确的数据
* @param scale 精确的精度
* @return double 型结果
*/
public static BigDecimal round(double d,int scale){
BigDecimal b1=new BigDecimal(Double.toString(d));
BigDecimal one=new BigDecimal("1");
return b1.divide(one,scale,BigDecimal.ROUND_HALF_UP);
}
/**
* 精确的四舍五入
* @param d 需要精确的数据
* @param scale 精确的精度
* @return double 型结果
*/
public static BigDecimal round(int d,int scale){
BigDecimal b1=new BigDecimal(Integer.toString(d));
BigDecimal one=new BigDecimal("1");
return b1.divide(one,scale,BigDecimal.ROUND_HALF_UP);
}
/**
* 精确的四舍五入
* @param d 需要精确的数据
* @param scale 精确的精度
* @return double 型结果
*/
public static BigDecimal round(String d,int scale){
BigDecimal b1=new BigDecimal(d);
BigDecimal one=new BigDecimal("1");
return b1.divide(one,scale,BigDecimal.ROUND_HALF_UP);
}
/**
* 精确的四舍五入,默认为了位小数
* @param d 需要精确的数据
* @return double 型结果
*/
public static BigDecimal round(double d){
return round(d,2);
}
/**
* 精确的四舍五入,默认为了位小数
* @param d 需要精确的数据
* @return double 型结果
*/
public static BigDecimal round(int d){
return round(d,2);
}
/**
* 精确的四舍五入,默认为了位小数
* @param d 需要精确的数据
* @return double 型结果
*/
public static BigDecimal round(String d){
return round(d,2);
}
/**
* 格式化数字
* @param number 需要格式化的数字
* @param formatStr 字符串格式 如:0.00
* @return
*/
public static String format(long number,String formatStr){
DecimalFormat df = new DecimalFormat(formatStr);
return df.format(number);
}
/**
* 格式化数字,默认格式为0.00
* @param number
* @return
*/
public static String format(long number){
return format(number,"0.00");
}
/**
* 格式化数字,默认格式为0.00
* @param number
* @return
*/
public static String format(double number){
return format(number,"0.00");
}
/**
* 格式化数字
* @param number 需要格式化的数字
* @param formatStr 字符串格式 如:0.00
* @return
*/
public static String format(double number,String formatStr){
DecimalFormat df = new DecimalFormat(formatStr);
return df.format(number);
}
/**
* 格式化数字
* @param number 需要格式化的数字
* @param formatStr 字符串格式 如:0.00
* @return
*/
public static String format(Object number,String formatStr){
DecimalFormat df = new DecimalFormat(formatStr);
return df.format(Double.valueOf(String.valueOf(number)));
}
/**
* 格式化数字,默认格式为0.00
* @param number
* @return
*/
public static String format(Object number){
return format(Double.valueOf(String.valueOf(number)),"0.00");
}
}
转载自:http://thinktothings.iteye.com/blog/801301
分享到:
相关推荐
在Java中,浮点数(float和double)是基于IEEE 754标准的,它们使用二进制浮点表示法,这导致在进行除法、乘法、加法和减法等操作时可能会出现非预期的精度损失。例如,两个看似相等的浮点数在计算后可能因为舍入...
Java 中 float 和 double 的区别详解 float 和 double 是 Java 中两种基本数据类型,都是用来表示实数的,但是它们有很大的区别。float 是单精度类型,精度是 8 位有效数字,取值范围是 10 的 -38 次方到 10 的 38 ...
Java 中的浮点数类型 float 和 double 在进行运算时会出现不精确的问题,这是因为计算机无法精确地表示十进制小数。这种问题不仅存在于 Java 中,在其它许多编程语言中也存在。 问题的提出: 编译运行下面的 Java ...
### Java中实现浮点数的精确计算 在Java编程中,使用`float`和`double`类型进行浮点数计算时经常会遇到精度丢失的问题。这是因为浮点数在计算机内部是以二进制形式存储的,而某些十进制小数无法用二进制精确表示,...
- 基本数据类型包括整型(byte, short, int, long)、浮点型(float, double)、字符型(char)和布尔型(boolean)。这些类型用于存储简单数值和逻辑值,例如,我们可以用int存储金额,用boolean判断某项记录是否...
**问题背景**:在Java中使用`double`或`float`类型进行计算时,可能会出现非预期的结果,这是由于浮点数的存储方式导致的精度损失问题。 **解决方案**: 1. **使用`BigDecimal`**:对于需要高精度计算的场景,推荐...
- 当需要处理大整数或高精度浮点数时,可以使用 `BigInteger` 和 `BigDecimal` 类,它们提供不受平台限制的精确计算。 4. **日期和数字的转换** - 在处理日期字符串和日期对象之间转换时,`SimpleDateFormat....
在Java编程语言中,浮点数类型包括`float`和`double`,它们分别用于存储单精度和双精度浮点数。了解如何在源码级别获取这两种类型的最大和最小值对于编写高效且精确的代码至关重要。本文将深入探讨Java中获取浮点数...
在进行商业计算时,由于浮点数(double和float)存在精度问题,不能保证准确的结果,因此通常推荐使用BigDecimal来确保计算的精确性。本文将深入探讨BigDecimal的基本操作、应用场景及注意事项。 首先,创建...
在Java编程语言中,String类是一个不可变的final类,这意味着一旦创建了String对象,就不能改变其...此外,对于浮点数转换,还需要注意精度损失的问题,因为String表示的浮点数可能无法精确表示为double或float类型。
关于浮点数运算,Java中3*0.1并不等于0.3,原因在于浮点数在计算机中并不能表示得完全精确,存在精度丢失的问题。因此,当我们需要比较两个浮点数是否相等时,不能直接使用等号,而应当使用一定的容差来进行比较。 ...
它在处理财务计算、精确数学运算等场景中尤为关键,因为普通的`float`和`double`类型可能会因为精度问题导致计算结果不准确。今天我们将深入探讨如何将`BigDecimal`对象转换为`String`,以及在这个过程中可能遇到的...
- 浮点运算可能存在精度损失,因此对于精确计算,应使用`BigDecimal`类。 6. **进制表示**: - 在Java中,整型数据可以使用10进制、8进制(前缀`0`)和16进制(前缀`0x`或`0X`)表示,但不能使用二进制表示。 7...
- A:java.1ang包包含了Object、Class、System、String和Thread等类。 - B:System类提供了标准输入输出流等方法。 - C:Class类反映了类的信息,并提供了获取类信息的方法。 - D:Object类是所有Java类的基类。...
- 在Java中,自动进行的数据类型转换通常是将较小的数据类型转换为较大的数据类型(如`int`到`float`或`float`到`double`)。但如果需要将较大的类型转换为较小的类型,则必须显式地进行类型转换。 - 示例程序5:`...
本文将深入探讨如何在Java中保留两位小数,并覆盖四舍五入、浮点数精确计算以及避免科学记数法等问题。 #### 四舍五入保留两位小数 四舍五入是数学中的一个基本概念,指的是当一个数的小数部分小于等于0.5时,将其...
在处理工资时,可能会用到int(整数)存储基本工资、float或double(浮点数)存储精确的金额,以及String(字符串)存储老师的名字和职称。 9. **运算符**: 运算符用于执行数学计算,如加法(+)、减法(-)、...