BigDecimal自学笔记

原创 2013年12月04日 10:05:59

先看看下面这个例子:

public class DoubleTest1 {
	public static void main(String[] args) {
		System.out.println("0.05+0.01="+(0.05+0.01));
		System.out.println("1.0-0.42="+(1.0-0.42));
		System.out.println("4.015*100="+(4.015*100));
		System.out.println("123.3/100="+(123.3/100));
	}
}
 运行结果:

0.05+0.01=0.060000000000000005

1.0-0.42=0.5800000000000001

4.015*100=401.49999999999994

123.3/100=1.2329999999999999

 

上面的例子表明,java的double类型会发生精度丢失,尤其在进行算术运算时更容易发生这种情况。(不仅java,很多语言都存在这样的问题)

当程序使用new BigDecimal(0.1)来创建一个BigDecimal对象时,它的值并不是0.1,实际上等于0.10000000000000055435324324233224.这是因为0.1无法准确地表示为double浮点数,所以传入BigDecimal构造器的值不会正好等于0.1(虽然表面上等于该值)

 

如果使用BigDecimal(String val)构造器的结果是可预知的——例如new BigDecimal("0.1")将创建一个BigDecimal,它正好等于预期的0.1,因此通常建议优先使用基于String的构造器。

 

如果必须使用double浮点数作为BigDecimal构造器的参数时,不要直接将double浮点数作为构造器参数创建BigDecimal对象,而是应该通过BigDecimal.valueOf(double value)静态方法来创建BigDecimal对象。

 

import java.math.BigDecimal;
public class BigDecimalTest {
	public static void main(String[] args) {
		BigDecimal f1 = new BigDecimal("0.05");
		BigDecimal f2 = BigDecimal.valueOf(0.01);
		BigDecimal f3 = new BigDecimal(0.05);
		 
		System.out.println("使用String作为BigDecimal构造器参数:");
		System.out.println("0.05 + 0.01 = " + f1.add(f2));
		System.out.println("0.05 - 0.01 = " + f1.subtract(f2));
		System.out.println("0.05 * 0.01 = " + f1.multiply(f2));
		System.out.println("0.05 / 0.01 = " + f1.divide(f2));
		 
		System.out.println("使用double作为BigDecimal构造器:");
		System.out.println("0.05 + 0.01 = " + f3.add(f2));
		System.out.println("0.05 - 0.01 = " + f3.subtract(f2));
		System.out.println("0.05 * 0.01 = " + f3.multiply(f2));
		System.out.println("0.05 / 0.01 = " + f3.divide(f2));
	}
}

 

运行结果:

使用String作为BigDecimal构造器参数:

0.05 + 0.01 = 0.06

0.05 - 0.01 = 0.04

0.05 * 0.01 = 0.0005

0.05 / 0.01 = 5

使用double作为BigDecimal构造器:

0.05 + 0.01 = 0.06000000000000000277555756156289135105907917022705078125

0.05 - 0.01 = 0.04000000000000000277555756156289135105907917022705078125

0.05 * 0.01 = 0.0005000000000000000277555756156289135105907917022705078125

0.05 / 0.01 = 5.000000000000000277555756156289135105907917022705078125

 

在金融项目中,需要对金额精确度高

 

package hb.bigdecimal;
import java.math.BigDecimal;

public class BigDecimalDemo {

	public static void main(String[]args){
		double v1 = 3.5;
		double v2 = 0.7;
//		BigDecimal result = add(v1, v2);
//		BigDecimal result = sub(v1, v2);
//		BigDecimal result = mul(v1, v2);
		BigDecimal result = div(v1, v2);
		System.out.println(result);
		
		BigDecimal a = new BigDecimal(998.01);  
		BigDecimal a1 = BigDecimal.valueOf(998.01);  
		BigDecimal b=new BigDecimal("100");  
		System.out.println(a.multiply(b));  
		System.out.println(a1.multiply(b));  //期望值一样
		  
		BigDecimal aa = new BigDecimal(135.95);  
		BigDecimal aa1 = new BigDecimal("135.95");  
		BigDecimal bb=new BigDecimal("100");  
		System.out.println(aa.multiply(bb));  
		System.out.println(aa1.multiply(bb));   //期望值一样
		  
		  
		BigDecimal test = new BigDecimal(4.015);  
		BigDecimal test2 = BigDecimal.valueOf(4.015);  
		BigDecimal test1 = new BigDecimal(100);  
		System.out.println(test.multiply(test1));
		System.out.println(test2.multiply(test1)); //期望值一样
		
		BigDecimal aa11 = new BigDecimal(135.95);  
		BigDecimal aa12 = new BigDecimal("135.95");  
		BigDecimal bb1=new BigDecimal("100");  
		BigDecimal result1=aa11.multiply(bb1); 
		BigDecimal result2=aa12.multiply(bb1);  //期望值一样
		//将这个BigDecimal小数点后保留2位,四舍五入的方式为向最接近数字方向舍入的舍入模式,如果与两个相邻数字的距离相等,则向相邻的偶数舍入
		System.out.println(result1.setScale(2,BigDecimal.ROUND_HALF_EVEN));
		System.out.println(result2.setScale(2,BigDecimal.ROUND_HALF_EVEN));
		
		
	}
	
	/**
	 * 用第一个数除以第二个数
	 * 提供精确的除法运算 当除不尽时,精确到小数点后10位,以后的数字四舍五入 
	 * @param v1
	 * @param v2
	 * @return
	 */
	public static BigDecimal div(double v1,double v2){
		BigDecimal b1 = new BigDecimal(Double.toString(v1));
		BigDecimal b2 = new BigDecimal(Double.toString(v2));
		//13表示小数点后面精确到多少位
		return b1.divide(b2, 13, BigDecimal.ROUND_HALF_UP);
	}
	
	/**
	 * 连个数相乘
	 * @param v1
	 * @param v2
	 * @return
	 */
	public static BigDecimal mul(double v1,double v2){
		BigDecimal b1 = new BigDecimal(Double.toString(v1));
		BigDecimal b2 = new BigDecimal(Double.toString(v2));
		return b1.multiply(b2);
	}
	
	/**
	 * 计算第一个数减去第二个数
	 * @param v1
	 * @param v2
	 * @return
	 */
	public static BigDecimal sub(double v1,double v2){
		BigDecimal b1 = new BigDecimal(Double.toString(v1));
		BigDecimal b2 = new BigDecimal(Double.toString(v2));
		return b1.subtract(b2);
	}
	
	/**
	 * 计算两个数相加
	 * @param v1
	 * @param v2
	 * @return
	 */
	public static BigDecimal add(double v1,double v2){
		BigDecimal b1 = new BigDecimal(Double.toString(v1));
		BigDecimal b2 = new BigDecimal(Double.toString(v2));
		return b1.add(b2);
	}
}

 运行结果:

5.0000000000000

99800.999999999999090505298227071762084960937500

99801.00

13594.99999999999886313162278383970260620117187500

13595.00

401.49999999999996802557689079549163579940795898437500

401.500

13595.00

13595.00

 

 

Hibernate自学详细笔记

Hibernate详细自学笔记,初学者快来看看吧!!!!
  • wangyang1354
  • wangyang1354
  • 2015年08月31日 21:23
  • 1244

JSP学习笔记(一):JSP基础

一、原理 1、HttpServlet 是先由源代码编译为class 文件,然后部署到服务器下。先编译后部署。 2、JSP 是先部署源代码后编译为class文件的,先部署后编译。JSP 会在客户端第一次...
  • u012228718
  • u012228718
  • 2015年02月17日 09:32
  • 983

数据库学习笔记

1. PL/SQL Command Window 2. 简单的语句块 a. begin dbms_output.put_line('hellow world'); end; / ...
  • xuxurui007
  • xuxurui007
  • 2013年12月08日 23:45
  • 1388

AVR单片机学习笔记

下面是自己在学习AVR单片机时的学习经验,分享出来给大家,一起学习。 1、  AVR单片机采用RISC架构,8051单片机采用CISC架构。前者速度为后者的2~4倍,为流水线操作指令 2、...
  • yzhajlydy
  • yzhajlydy
  • 2013年05月21日 16:25
  • 2301

java自学笔记(第六天)

文章包含: 1.编译型语言,解释型语言,java语言的区别;2.JDK的下载;3.dk,jre,jvm之间的关系;4.配置java环境变量;5.文档注解;6.标识符;7.变量...
  • qq_36621510
  • qq_36621510
  • 2017年12月21日 11:25
  • 60

javascript基础学习笔记

编者寄言:  本文主要为编者读书笔记,在文章里面很多话是掺杂了编者自己的见解,如果有哪里出现错误或者用词不严谨,请友善留言,编者会及时去更改。 本文很多地方只是简单说了一下应该注意的地方,具体代码部分...
  • u012967849
  • u012967849
  • 2016年07月20日 14:08
  • 1905

matlab学习笔记(基础)

开头第一段怎么讲,学matlab的当前目标是看懂别人的matlab代码,所以先跳过前面一堆命令行,看看matlab代码是个什么。脚本文件首先,一个用文本形式保存的matlab代码有两种形式:matla...
  • King_John
  • King_John
  • 2017年04月08日 11:00
  • 886

2017年7月-学习笔记

本学习笔记主要记录了我对tcp/ip卷1这本书的学习心得,主要看的电子版的数目,本文中图片如无特别说明,均来自,[张防涛-简书]当中tcp/ip详解的文章。作者:张芳涛 链接:http://www....
  • Kang_TJU
  • Kang_TJU
  • 2017年07月17日 10:29
  • 489

无线学习笔记

原文地址:http://blog.csdn.net/Y424444363/article/details/4790637   无线学习笔记 第一章 讨论网络的分类及802.11技术的定位 ...
  • zahuopuboss
  • zahuopuboss
  • 2013年06月04日 22:59
  • 2035

BigDecimal 加减乘除

在java 里面,int 的最大值是:2147483647,现在如果想用比这个数大怎么办?换句话说,就是数值较大,这时候就用到了BigDecimal  下载整理了一下BigDecimal 的加减乘...
  • limingchuan123456789
  • limingchuan123456789
  • 2013年10月09日 21:05
  • 82524
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:BigDecimal自学笔记
举报原因:
原因补充:

(最多只允许输入30个字)