Java中的BigDecimal和原始数据类型
由于其不精确性,浮点数据类型不能用于金融计算。这就是为什么Java提供了一个名为BigDecimal的独立类来执行运算。BigDecimal减少了计算错误的几率。
在双数上,BigDecimal类提供了算术、比例管理、四舍五入、比较、格式转换和散列函数。它通过处理大大小小的浮点整数,以特殊的精度来弥补时间上的复杂性。
这些基本的算术操作可以在BigDecimal上进行,也可以在BigDecimal和原始数据类型之间进行。这就是我们在这篇文章中要介绍的内容。
虽然BigInteger 和BigDecimal 都支持任意精度的整数,但BigDecimal只支持任意精度的定点数字。如果你正在构建一个低延迟的应用程序,每一个微秒都很重要,那么BigDecimal/BigInteger是不可取的。
让我们看看我们的第一个例子,用一个Java程序对两个大的小数进行加减乘运算。
import java.io.*;
import java.math.BigDecimal;
class Example {
public static void main(String[] args)
{
// Declaration of the BigDecimal numbers
BigDecimal first1 = new BigDecimal("25.35557");
BigDecimal sec2 = new BigDecimal("55.3767");
// Actual arithmetic addition operation
System.out.println("Adding first1 and sec2 = "
+ (first1.add(sec2)));
// Actual arithmetic subtraction operation
System.out.println("Subtracting first1 and sec2 = "
+ (first1.subtract(sec2)));
// Actual arithmetic multiplication operation
System.out.println(
"Multiplying first1 and sec2 = "
+ (first1.multiply(sec2)));
}
}
输出。
Adding first1 and sec2 = 80.73227
Subtracting first1 and sec2 = -30.02113
Multiplying first1 and sec2 = 1404.107793
我们对我们的两个声明的BigDecimals进行了三次操作;减法、加法和乘法操作。
这里有一点需要注意,我们没有进行除法运算,因为这两个数字的除法是不终止的。
这就抛出了一个错误。然而我们知道,BigDecimal的建立是为了提供最高水平的精度。
我们将在下面的代码中解决这个问题,我们将对同样的整数进行除法运算,但是这一次的数据类型将是双数。因此,应该不会出现错误。
让我们来看看下面的第二个例子。
import java.io.*;
class Example {
public static void main(String[] args)
{
double first1 = 25.35557;
double sec2 = 55.3767;
System.out.println("Dividing first1 and sec2 = "
+ (sec2 / first1));
}
}
输出。
Dividing first1 and sec2 = 0.45787434
原始数据类型
我们已经对我们的BigDecimal对象进行了几次操作。现在,我们将尝试对原始数据类型进行同样的操作。
现在让我们看一下第三个例子。
import java.io.*;
import java.math.BigDecimal;
class Example {
public static void main(String[] args)
{
// Declaring an integer number and BigDecimal object
BigDecimal first1 = new BigDecimal("15");
int sec2 = 20;
// Adding both of them
System.out.println("Adding first1 and sec2 ="
+ first1.add(sec2));
}
}
在运行上面的代码时,会抛出一个错误,指出int 不能转换为BigDecimal 。
出现这样的错误是因为该操作只能在BigDecimal对象上执行。我们的原始数据类型必须使用BigDecimal类的构造函数转换为BigDecimal对象。
我们正在构造一个新的BigDecimal类对象,其值与sec2 相同,并将其作为参数直接提供给add() 方法。
下面的代码以如下方式解决了这个问题。
import java.io.*;
import java.math.BigDecimal;
class Example {
public static void main(String[] args)
{
// Declaring a BigDecimal object and integer number
BigDecimal first1 = new BigDecimal("15");
int sec2 = 20;
System.out.println(
"Adding first1 and sec2 = "
+ first1.add(new BigDecimal(sec2)));
}
}
输出。
Adding first1 and sec2 = 35
最后,请看下面的例子,显示了BigDecimal 和int 之间的算术运算,以更好地理解它。
import java.io.*;
import java.math.BigDecimal;
class Example {
public static void main(String[] args)
{
// Declaring an integer number and a BigDecimal object
BigDecimal first1 = new BigDecimal("15");
int sec2 = 20;
System.out.println(
"Adding first1 and sec2 = "
+ first1.add(new BigDecimal(sec2)));
System.out.println(
"Subtracting first1 and sec2 = "
+ first1.subtract(new BigDecimal(sec2)));
System.out.println(
"Multiplying first1 and sec2 = "
+ first1.multiply(new BigDecimal(sec2)));
System.out.println(
"Dividing first1 and sec2 = "
+ first1.divide(new BigDecimal(sec2)));
}
}
输出。
Adding first1 and sec2 = 35
Subtracting first1 and sec2 = -5
Multiplying first1 and sec2 = 300
Dividing first1 and sec2 = 0.75
在数据库、应用程序或视图中不允许出现空值。一切都以new BigDecimal(0)来初始化。或者,你在每次使用可空值时都执行空值检查。
对BigDecimal的需求
浮点数的使用有很多乐趣。双重类型通常用于数量,除非数值是一个整数,在这种情况下,通常可以使用int类型。
此外,还可以使用float,或long,这取决于一个值的大小value 。
应该注意的是,这些类型是你在处理金钱时可以使用的最糟糕的东西。它们不提供正确的值,而是提供一个可以以二进制格式存储的值。
关于原始数据类型
它们是最简单的类型。可以通过使用原始类型作为开发的起点来设计你的复杂类型。
原始类型更容易在应用程序中使用,因为它们可以大量提高性能。基于对象的原始类型的实现会带来相当大的性能。
由于它们的名字,它们可以与广泛的对象相联系。然而,Java中的非原始数据类型是由程序员建立的。
出于同样的原因,原始类型与包装类的实例相比,效率更高。
原始和非原始数据类型
原始数据类型和非原始数据类型的区别主要在于它们的基础数据类型。这意味着Java自带了一组已经被指定的原始类型。
相比之下,原始类型不能用来调用方法来执行特定的动作。
原始类型总是有一个值,而其他类型可以为空。
结论
BigDecimal是一种表示数字的手段,它是准确的。拥有一个double ,可以让你在游戏中获得一定程度的精确性。
在处理不同大小的双数时,由于大小差异太大,较小的那个可能会从总和中被剔除。而使用BigDecimal则不会出现这种情况。
BigDecimal的缺点是速度较慢,而且更难编写算法。
我希望这篇文章对你有所帮助。