`
singleant
  • 浏览: 375108 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

【性能】Java BigDecimal和double性能比较

阅读更多

 

我们知道 java 里面有个 BigDecimal ,可以解决我们的精度丢失问题。

但是很少关注其性能情况,因为一般来说可以忽略不计的。

也确实,解决大数据量运算 java 本身并不适合。

 

本人愚笨,很早之前用 java 解决一个大数据量运算的算法,对性能要求很高。中间用了 BigDecimal ,注意到其性能的一些情况,发现其性能是 double 100 倍左右。

具体没有去深究其原因,平时其实也不用对这个在意,但是对这个知识做个基本的了解还是有必要的。

 

直接上代码:

 

import java.math.BigDecimal;

public class BigDecimalEfficiency {

	public static int REPEAT_TIMES = 1000000;

	public static double computeByBigDecimal(double a, double b) {
		BigDecimal result = BigDecimal.valueOf(0);
		BigDecimal decimalA = BigDecimal.valueOf(a);
		BigDecimal decimalB = BigDecimal.valueOf(b);
		for (int i = 0; i < REPEAT_TIMES; i++) {
			result = result.add(decimalA.multiply(decimalB));
		}
		return result.doubleValue();
	}

	public static double computeByDouble(double a, double b) {
		double result = 0;
		for (int i = 0; i < REPEAT_TIMES; i++) {
			result += a * b;
		}
		return result;
	}

	public static void main(String[] args) {
		long test = System.nanoTime();
		long start1 = System.nanoTime();
		double result1 = computeByBigDecimal(0.120000000034, 11.22);
		long end1 = System.nanoTime();
		long start2 = System.nanoTime();
		double result2 = computeByDouble(0.120000000034, 11.22);
		long end2 = System.nanoTime();

		long timeUsed1 = (end1 - start1);
		long timeUsed2 = (end2 - start2);
		System.out.println("result by BigDecimal:" + result1);
		System.out.println("time used:" + timeUsed1);
		System.out.println("result by Double:" + result2);
		System.out.println("time used:" + timeUsed2);

		System.out.println("timeUsed1/timeUsed2=" + timeUsed1 / timeUsed2);
	}
}
 

 

结果:

 

result by BigDecimal:1346400.00038148
time used:572537012
result by Double:1346400.000387465
time used:5280000
timeUsed1/timeUsed2=108

 

对比图:

 

 

从以上结果来看,bigDecimal的性能可见一斑。其性能竟然是double的100倍,这是很早之前没想到的。

 

  • 大小: 21.8 KB
2
2
分享到:
评论
4 楼 真的全站唯一 2019-05-09  
描述的能不能准确一点,我也以为bigDecimal性能比double好100倍。。
3 楼 rex2018 2013-02-27  
求教:如果要处理大数据量的计算,不用JAVA应该用什么?
2 楼 cn-done 2011-10-08  
咋一看【中间用了 BigDecimal ,注意到其性能的一些情况,发现其性能是 double 的 100 倍左右】还以为bigdecemail性能要优于double呢
吓一跳!
1 楼 springlys 2011-08-28  
拿时间换精度,值得

相关推荐

    BigDecimal向Double转换

    BigDecimal向Double转换

    Java BigDecimal和double示例及相关问题解析

    主要介绍了Java BigDecimal和double示例及相关问题解析,简单介绍了BigDecimal类的相关内容,分享了两则相关实例,对问题进行了分析,具有一定参考价值,需要的朋友可以了解下。

    Java用BigDecimal解决double类型相减时可能存在的误差

    主要介绍了Java用BigDecimal解决double类型相减时可能存在的误差,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

    java BigDecimal操作

    NULL 博文链接:https://ollevere.iteye.com/blog/1528655

    java-BigInteger-BigDecimal类源码

    BigInteger.java BigDecimal.java 文件 源代码

    Java SE程序 BigDecimal类

    Java SE程序 BigDecimal类Java SE程序 BigDecimal类Java SE程序 BigDecimal类Java SE程序 BigDecimal类Java SE程序 BigDecimal类Java SE程序 BigDecimal类Java SE程序 BigDecimal类Java SE程序 BigDecimal类Java SE...

    Java BigDecimal详解_动力节点Java学院整理

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

    Java Bigdecimal使用原理详解

    主要介绍了Java Bigdecimal使用原理详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

    BigDecimal 加减乘除运算

    float和double只能用来做科学计算或者是工程计算,在商业计算中要用java.math.BigDecimal。BigDecimal所创建的是对象,我们不能使用传统的+、-、*、/等算术运算符直接对其对象进行数学运算,而必须调用其相对应的...

    Java BigDecimal使用及基本运算(推荐)

    Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。这篇文章主要介绍了Java BigDecimal使用指南针(推荐),本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,...

    Java中BigDecimal的加减乘除、比较大小与使用注意事项

    对于不需要任何准确计算精度的数字可以直接使用float或double,但是如果需要精确计算的结果,则必须使用BigDecimal类,而且使用BigDecimal类也可以进行大数的操作,下面这篇文章给大家介绍了Java中BigDecimal的加减...

    Java编程BigDecimal用法实例分享

    主要介绍了Java编程BigDecimal用法实例分享,具有一定参考价值,需要的朋友可以了解下。

    BigDecimal开n次方根

    复杂的BigDecimal计算,需要开方的式子,可输入结果精确位数

    关于BigDecimal的构造函数与大小比较

    BigDecimal的大小比较,1.0与1.00是不相等的,得采用它自带的compareTo方法: java 代码 int i=b1.compareTo(b2) 这一次,返回的i可能为-1、0、1,分别表示小于、等于、大于 构造函数:解决了上面这个问题好像...

    Java BigDecimal类用法详解

    BigDecimal 由任意精度的整数非标度值 和32 位的整数标度 (scale) 组成。如果为零或正数,则标度是小数点后的位数。如果为负数,则将该数的非标度值乘以 10 的负scale 次幂。

    Java中double类型下出现精度计算错误情况下出力方法

    Java中的简单浮点数类型float和double不能够进行运算,因为大多数情况下是正常的,但是偶尔会出现如上所示的问题。这个问题其实不是JAVA的bug,因为计算机本身是二进制的,而浮点数实际上只是个近似值,所以从二进制...

    java.math.BigDecimal 操作类

    java.math.BigDecimal 操作类,包含加减乘除、String型加减乘除精度格式化转换计算等

    BigDecimal工具类.docx

    BigDecimal工具类.docx

    big-math:使用任意精度的高级Java BigDecimal数学函数(pow,sqrt,log,sin等)

    使用任意精度的高级Java BigDecimal数学函数( pow , sqrt , log , sin ,...)。 另请参阅官方的。大十进制数学BigDecimalMath类为以下各项提供了有效且准确的实现: log(BigDecimal, MathContext) exp...

    Java中BigDecimal的基本运算(详解)

    下面小编就为大家带来一篇Java中BigDecimal的基本运算(详解)。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

Global site tag (gtag.js) - Google Analytics