`
singleant
  • 浏览: 378212 次
  • 性别: 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  
拿时间换精度,值得

相关推荐

    java中BigDecimal的操作方法

    在进行商业计算时,由于浮点数(double和float)存在精度问题,不能保证准确的结果,因此通常推荐使用BigDecimal来确保计算的精确性。本文将深入探讨BigDecimal的基本操作、应用场景及注意事项。 首先,创建...

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

    这是因为`float`和`double`类型虽然适用于科学计算和工程计算,但它们基于二进制浮点运算,不能保证完全精确的结果。而`BigDecimal`类提供了对任意精度的十进制数的支持,确保了商业计算中的准确性。 ### `...

    java-BigInteger-BigDecimal类源码

    因此,在处理大整数时需要注意性能和内存消耗。 3. **构造方法**:`BigInteger`提供多种构造方法,例如从字符串、整数或字节数组创建实例。 4. **比较操作**:`BigInteger`提供了`compareTo()`方法,用于比较两个`...

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

    由于 double 和 float 类型在处理大数或需要绝对精确计算的场景下存在精度损失,因此 BigDecimal 成为了商业计算和金融计算的标准工具。 在使用 BigDecimal 时,我们需要通过构造函数来创建对象,通常我们会传入一...

    关于java中BigDecimal的简介(csdn)————程序.pdf

    Java中的`BigDecimal`类是用于表示和操作高精度浮点数的重要工具,尤其适用于需要进行精确计算的场景,如财务和货币计算。由于基本数据类型`double`和`float`在进行大数值或高精度计算时可能会导致精度丢失,因此`...

    Java BigDecimal类用法详解

    Java中的`BigDecimal`类是用来表示任意精度的十进制数,尤其适合于需要精确计算的商业和财务场景。它的核心概念包括非标度值(unscaled value)和标度(scale),非标度值是一个任意精度的整数,标度则是小数点后的...

    BigDecimal加减乘除计算

    总之,BigDecimal 是 Java 中用于高精度计算的关键工具,通过其提供的方法和舍入模式,可以确保在财务等对精度有严格要求的场景下进行准确的计算。在实际编程中,应优先使用字符串构造 BigDecimal 对象,并合理设置...

    Java 精确计算-double-float-String

    2. **基本运算**:`BigDecimal`提供了加法(`add()`), 减法(`subtract()`), 乘法(`multiply()`) 和除法(`divide()`), 以及比较操作(`compareTo()`)等方法。 3. **设置精度**:为了控制计算结果的精度,可以使用`...

    Java中BigDecimal类的简单用法

    在实际开发中,BigDecimal类提供了许多其他的方法,如add()用于加法,divide()用于除法,compare()用于比较两个BigDecimal对象的大小,scale()和precision()用于获取或设置小数位数等。在进行商业计算时,尤其是涉及...

    java实现大数加法(BigDecimal)的实例代码

    与Java中的`int`, `long`, `float`, `double`等基本类型不同,`BigDecimal`不依赖于机器的浮点数表示,因此可以进行精确的算术运算,避免了浮点数运算常见的精度损失问题。 在给定的实例代码中,我们首先创建两个`...

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

    Java BigDecimal详解 BigDecimal 是 Java 中的一个类,它由任意精度的整数非标度值和 32...它也可以用于科学计算和工程计算,但是需要注意的是,BigDecimal 的性能相对来说较低,需要根据实际情况选择合适的数值类型。

    BigInteger BigDecimal 使用

    在Java编程语言中,`BigInteger`和`BigDecimal`是两个重要的类,用于处理大整数和高精度浮点数运算。这两个类属于`java.math`包,为开发者提供了超越普通`int`、`long`以及`float`和`double`类型的数值计算能力。 `...

    Java BigDecimal类的使用和注意事项

    Java中的`BigDecimal`类是用来处理高精度和任意精度的十进制数值的,它主要用于金融或者科学计算中,需要精确的浮点数运算。在Java的`java.math`包下,`BigDecimal`提供了丰富的算术操作,确保了计算的准确性。 `...

    BigDecimal计算

    在Java编程语言中,`BigDecimal`类是用于表示和操作大数(通常涉及财务或精确数学计算)的重要工具。由于浮点数(如`float`和`double`)在计算机中是以近似值存储的,这可能导致计算结果的不精确性,尤其是在进行...

    使用BigDecimal进行精确运算(实现加减乘除运算)

    BigDecimal是Java中用于进行高精度、精确浮点数运算的类,它解决了浮点数在二进制表示下无法精确表示所有十进制数的问题。...在不需要精确计算的场合,仍然推荐使用float和double以获取更好的性能。

    double保留小数

    本文将详细介绍如何在Java中使用`BigDecimal`类来实现`double`类型数值保留指定小数位数的方法。 #### 二、基础知识 1. **BigDecimal类简介**: - `BigDecimal`是Java中用来处理任意精度的十进制数的一个类。 - ...

    Java中使用BigDecimal进行浮点数运算

    这是因为Java中的`float`和`double`数据类型基于二进制浮点数表示,这导致它们无法精确表示某些十进制数值。例如,尝试直接进行以下计算: ```java System.out.println(0.05 + 0.01); System.out.println(1.0 - ...

    运用BigDecimal精确计算

    - 避免使用`equals()`方法比较`BigDecimal`对象,应该使用`compareTo()`,因为`equals()`是基于内容和类型进行比较的,而`compareTo()`是基于数值进行比较的。 示例代码: ```java import java.math.BigDecimal; ...

    Java中BigDecimal类与int、Integer使用总结

    此外,`BigDecimal`还提供了`toString()`方法将值转换为字符串,以及`doubleValue()`、`floatValue()`、`longValue()`和`intValue()`方法将`BigDecimal`转换为其他数值类型。但需要注意的是,这些转换可能导致精度...

    C#和java数据类型的等价类型

    C#和Java数据类型的等价类型 C#和Java都是面向对象的编程语言,它们都支持多种数据类型,以便于开发者在编程时...了解这些数据类型的特点和用途,可以帮助开发者更好地选择合适的数据类型,以提高程序的性能和可读性。

Global site tag (gtag.js) - Google Analytics