我们知道
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
分享到:
相关推荐
在进行商业计算时,由于浮点数(double和float)存在精度问题,不能保证准确的结果,因此通常推荐使用BigDecimal来确保计算的精确性。本文将深入探讨BigDecimal的基本操作、应用场景及注意事项。 首先,创建...
这是因为`float`和`double`类型虽然适用于科学计算和工程计算,但它们基于二进制浮点运算,不能保证完全精确的结果。而`BigDecimal`类提供了对任意精度的十进制数的支持,确保了商业计算中的准确性。 ### `...
因此,在处理大整数时需要注意性能和内存消耗。 3. **构造方法**:`BigInteger`提供多种构造方法,例如从字符串、整数或字节数组创建实例。 4. **比较操作**:`BigInteger`提供了`compareTo()`方法,用于比较两个`...
由于 double 和 float 类型在处理大数或需要绝对精确计算的场景下存在精度损失,因此 BigDecimal 成为了商业计算和金融计算的标准工具。 在使用 BigDecimal 时,我们需要通过构造函数来创建对象,通常我们会传入一...
Java中的`BigDecimal`类是用于表示和操作高精度浮点数的重要工具,尤其适用于需要进行精确计算的场景,如财务和货币计算。由于基本数据类型`double`和`float`在进行大数值或高精度计算时可能会导致精度丢失,因此`...
Java中的`BigDecimal`类是用来表示任意精度的十进制数,尤其适合于需要精确计算的商业和财务场景。它的核心概念包括非标度值(unscaled value)和标度(scale),非标度值是一个任意精度的整数,标度则是小数点后的...
总之,BigDecimal 是 Java 中用于高精度计算的关键工具,通过其提供的方法和舍入模式,可以确保在财务等对精度有严格要求的场景下进行准确的计算。在实际编程中,应优先使用字符串构造 BigDecimal 对象,并合理设置...
2. **基本运算**:`BigDecimal`提供了加法(`add()`), 减法(`subtract()`), 乘法(`multiply()`) 和除法(`divide()`), 以及比较操作(`compareTo()`)等方法。 3. **设置精度**:为了控制计算结果的精度,可以使用`...
在实际开发中,BigDecimal类提供了许多其他的方法,如add()用于加法,divide()用于除法,compare()用于比较两个BigDecimal对象的大小,scale()和precision()用于获取或设置小数位数等。在进行商业计算时,尤其是涉及...
与Java中的`int`, `long`, `float`, `double`等基本类型不同,`BigDecimal`不依赖于机器的浮点数表示,因此可以进行精确的算术运算,避免了浮点数运算常见的精度损失问题。 在给定的实例代码中,我们首先创建两个`...
Java BigDecimal详解 BigDecimal 是 Java 中的一个类,它由任意精度的整数非标度值和 32...它也可以用于科学计算和工程计算,但是需要注意的是,BigDecimal 的性能相对来说较低,需要根据实际情况选择合适的数值类型。
在Java编程语言中,`BigInteger`和`BigDecimal`是两个重要的类,用于处理大整数和高精度浮点数运算。这两个类属于`java.math`包,为开发者提供了超越普通`int`、`long`以及`float`和`double`类型的数值计算能力。 `...
Java中的`BigDecimal`类是用来处理高精度和任意精度的十进制数值的,它主要用于金融或者科学计算中,需要精确的浮点数运算。在Java的`java.math`包下,`BigDecimal`提供了丰富的算术操作,确保了计算的准确性。 `...
在Java编程语言中,`BigDecimal`类是用于表示和操作大数(通常涉及财务或精确数学计算)的重要工具。由于浮点数(如`float`和`double`)在计算机中是以近似值存储的,这可能导致计算结果的不精确性,尤其是在进行...
BigDecimal是Java中用于进行高精度、精确浮点数运算的类,它解决了浮点数在二进制表示下无法精确表示所有十进制数的问题。...在不需要精确计算的场合,仍然推荐使用float和double以获取更好的性能。
本文将详细介绍如何在Java中使用`BigDecimal`类来实现`double`类型数值保留指定小数位数的方法。 #### 二、基础知识 1. **BigDecimal类简介**: - `BigDecimal`是Java中用来处理任意精度的十进制数的一个类。 - ...
这是因为Java中的`float`和`double`数据类型基于二进制浮点数表示,这导致它们无法精确表示某些十进制数值。例如,尝试直接进行以下计算: ```java System.out.println(0.05 + 0.01); System.out.println(1.0 - ...
- 避免使用`equals()`方法比较`BigDecimal`对象,应该使用`compareTo()`,因为`equals()`是基于内容和类型进行比较的,而`compareTo()`是基于数值进行比较的。 示例代码: ```java import java.math.BigDecimal; ...
此外,`BigDecimal`还提供了`toString()`方法将值转换为字符串,以及`doubleValue()`、`floatValue()`、`longValue()`和`intValue()`方法将`BigDecimal`转换为其他数值类型。但需要注意的是,这些转换可能导致精度...
C#和Java数据类型的等价类型 C#和Java都是面向对象的编程语言,它们都支持多种数据类型,以便于开发者在编程时...了解这些数据类型的特点和用途,可以帮助开发者更好地选择合适的数据类型,以提高程序的性能和可读性。