文档章节

Java中BigDecimal的应用

liangtee
 liangtee
发布于 2012/12/27 11:11
字数 509
阅读 226
收藏 8

我们来看一看java中BigDecimal的用法

public class MathUtil {


// 加法 
public static Double add(double a,double b,int scal) throws Exception{

    BigDecimal add1 = conversionToBigDecimal(a);
    BigDecimal add2 = conversionToBigDecimal(b);
    Double result = add1.add(add2).setScale(scal,BigDecimal.ROUND_HALF_UP).doubleValue();
    return result;
}

 

// 减法
public static Double subtract(double a,double b,int scal) throws Exception{

    BigDecimal subtract1 = conversionToBigDecimal(a);
    BigDecimal subtract2 = conversionToBigDecimal(b);
    Double result = subtract1.subtract(subtract2).setScale(scal,BigDecimal.ROUND_HALF_UP).doubleValue();
    return result;
}


// 乘法
public static Double multiply(double a,double b,int scal) throws Exception{

    BigDecimal multiply1 = conversionToBigDecimal(a);
    BigDecimal multiply2 = conversionToBigDecimal(b);
    Double result = multiply1.multiply(multiply2).setScale(scal,BigDecimal.ROUND_HALF_UP).doubleValue();
    return result;
}

 
// 除法
public static Double divide(double a,double b,int scal) throws Exception{

    BigDecimal divide1 = conversionToBigDecimal(a);
    BigDecimal divide2 = conversionToBigDecimal(b);
    Double result = divide1.divide(divide2,scal,BigDecimal.ROUND_HALF_UP).doubleValue();
    return result;

}

 

// 类型转换

public static BigDecimal conversionToBigDecimal(Object obj) throws Exception
{
  if (obj instanceof Double)
  {
   return new BigDecimal(obj.toString());
  }
  else if (obj instanceof Float)
  {
   return new BigDecimal(obj.toString());
  }
  else if (obj instanceof Integer)
  {
   return new BigDecimal(obj.toString());
  }
  else if (obj instanceof Long)
  {
   return new BigDecimal(obj.toString());
  }
  else if (obj instanceof Byte)
  {
   return new BigDecimal(obj.toString());
  }
  else if (obj instanceof Short)
  {
   return new BigDecimal(obj.toString());
  }
  else
  {
   throw new Exception("不能转换");
  }
}


下面我们来看看BigDecimal的setScale方法

 

BigDecimal.setScale()方法用于格式化小数点

 

表示保留一位小数,默认用四舍五入方式
setScale(1)

 

直接删除多余的小数位,如2.35会变成2.3 
setScale(1,BigDecimal.ROUND_DOWN)

 

进位处理,2.35变成2.4 
setScale(1,BigDecimal.ROUND_UP)

 

四舍五入,2.35变成2.4
setScale(1,BigDecimal.ROUND_HALF_UP)

 

四舍五入,2.35变成2.3,如果是5则向下舍
setScaler(1,BigDecimal.ROUND_HALF_DOWN)

 


注意点一

scale指的是你小数点后的位数。scale()就是BigDecimal类中的方法。如
BigDecimal b = new BigDecimal("123.456"); 
b.scale(),返回的就是3

 


注意点二

roundingMode是小数的保留模式。它们都是BigDecimal中的常量字段,有很多种,如
BigDecimal.ROUND_HALF_UP表示的就是4舍5入

 


注意点三

pubilc BigDecimal divide(BigDecimal divisor, int scale, int roundingMode)的意思是说:我用一个BigDecimal对象除以divisor后的结果,并且要求这个结果保留有scale个小数位,roundingMode表示的就是保留模式是什么,是四舍五入啊还是其它的

 


注意点四

对于一般add、subtract、multiply方法的小数位格式化如下
BigDecimal mData = new BigDecimal("9.655").setScale(2, BigDecimal.ROUND_HALF_UP);
System.out.println("mData=" + mData);

© 著作权归作者所有

共有 人打赏支持
liangtee
粉丝 105
博文 94
码字总数 38111
作品 0
朝阳
程序员
Hibernate QBC语言

节 8.01 基本查询 以下是HQL/QBC/Native SQL三种查询策略 HQL策略: session.createQuery("FROM Category c where c.name like 'Laptop%'"); QBC策略: session.createCriteria(Category.cl......

ddtt
2011/12/22
0
0
Java Double相加出现的怪事

问题的提出: 编译运行下面这个程序会看到什么 [java] view plaincopy public class test { public static void main(String args[]) { System.out.println(0.05 + 0.01); System.out.print......

onedotdot
2017/11/05
0
0
180706-BigDecimal除法的精度问题

BigDecimal除法的精度问题 在使用BigDecimal的除法时,遇到一个鬼畜的问题,本以为的精度计算,结果使用返回0,当然最终发现还是自己的使用姿势不对导致的,因此记录一下,避免后面重蹈覆辙 ...

小灰灰Blog
07/06
0
0
Java 可变对象和不可变对象

一、简单定义 不可变对象(Immutable Objects)即对象一旦被创建它的状态(对象的数据,也即对象属性值)就不能改变,反之即为可变对象(Mutable Objects)。 不可变对象的类即为不可变类(Immuta...

JackieYeah
2014/03/04
0
0
Java BigDecimal详解

一、引言 借用《Effactive Java》这本书中的话,float和double类型的主要设计目标是为了科学计算和工程计算。他们执行二进制浮点运算,这是为了在广域数值范围上提供较为精确的快速近似计算而...

JackieYeah
2014/03/05
0
7

没有更多内容

加载失败,请刷新页面

加载更多

no such module 'pop'问题

在github上 clone 了一个 swift 项目,编译时提示"no such module 'POP'"错误,查了一下居然是因为podfile中指定的最低版本是iOS 11.0,大于我测试手机的iOS版本10.3.3,将Podfile中的最低版...

yoyoso
43分钟前
1
0
redis 系列一 -- 简介及安装

1.简介 redis -- remote dictionary server 远程字典服务 使用 C 语言编写; 高性能的 key-value数据库; 内存数据库,支持数据持久化。 Redis 是一个开源(BSD许可)的,内存中的数据结构存...

imbiao
今天
3
0
nginx log记录请求响应时间

有时为了方便分析接口性能等,需要记录请求的时长,通过修改nginx的日志格式可以做到,如 添加一个新的log_format log_format timed_combined '$remote_addr - $remote_user [$time_local] "...

swingcoder
今天
4
0
Spring MVC之RequestMappingHandlerMapping匹配

对于RequestMappingHandlerMapping,使用Spring的同学基本都不会陌生,该类的作用有两个: 通过request查找对应的HandlerMethod,即当前request具体是由Controller中的哪个方法进行处理; 查...

爱宝贝丶
今天
3
0
Java Web--增删改查之二界面后台java代码(转载参考)

/** *  *//** * @author Administrator * */package dao; import java.sql.*;public class DBConn {/** * 链接数据库 * @return */  ...

小橙子的曼曼
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部