Java BigDecimal类
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
开发工具与关键技术:
作者:陈剑波
撰写时间:2019年07月18日
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
BigDecimal类
为了能精确表示、计算浮点数,Java提供了BigDecimal类,该类提供了大量的构造器 用于创建BigDecimal对象,包括把所有的基本数值型变量转换成一个BigDecimal对 象,也包括利用数字字符串、数字字符数组来创建BigDecimal对象。
示例代码:
public class BigDecimalDemo { |
public static void main(String[] args) { |
// BigDecimal类常用构造器 |
char[] in = new char[] { '5', '6', '0', '0', '0' }; |
// BigDecimal(char[] |
// in):将BigDecimal的字符数组表示形式转换为BigDecimal,接受与BigDecimal(String)构造函数相同的字符序列。 |
BigDecimal bigDecimal = new BigDecimal(in); |
System.out.println("bigDecimal:" + bigDecimal); |
// BigDecimal(double val):将double转换为 BigDecimal,后者是 double 的二进制浮点值准确的十进 |
// 制表示形式。 |
BigDecimal bigDecimal2 = new BigDecimal(56000.0); |
System.out.println("bigDecimal2:" + bigDecimal2); |
// BigDecimal(int val):将 int 转换为 BigDecimal。 |
BigDecimal bigDecimal3 = new BigDecimal(56000); |
System.out.println("bigDecimal3:" + bigDecimal3); |
// BigDecimal(long val):将 long 转换为 BigDecimal。 |
BigDecimal bigDecimal4 = new BigDecimal(56000L); |
System.out.println("bigDecimal4:" + bigDecimal4); |
// BigDecimal(String val):将 BigDecimal 的字符串表示形式转换为 BigDecimal。 |
BigDecimal bigDecimal5 = new BigDecimal("56000"); |
System.out.println("bigDecimal5:" + bigDecimal5); |
// BigDecimal类常用方法 |
// valueOf(double val):使用 Double.toString(double) 方法提供的 |
// double 规范的字符串表示形式将 double 转 换为 BigDecimal。 |
BigDecimal bigDecima6 = BigDecimal.valueOf(56000.0); |
System.out.println("bigDecima6=" + bigDecima6); |
// valueOf(long val):将 long 值转换为具有零标度的 BigDecimal。 |
BigDecimal bigDecima7 = BigDecimal.valueOf(5600L); |
System.out.println("bigDecima7=" + bigDecima7); |
// BigDecimal加减乘除运算 |
// abs():返回 BigDecimal,其值为此 BigDecimal 的 绝对值,其标度为 this.scale()。 |
System.out.println("bigDecima6.abs()=" + bigDecima6.abs()); |
// add(BigDecimal augend):返回一个 BigDecimal,其值为 (this + augend) |
System.out.println("bigDecima6 + bigDecima7 =" |
+ bigDecima6.add(bigDecima7)); |
// subtract(BigDecimal subtrahend):返回一个 BigDecimal,其值为 (this - |
// subtrahend), |
System.out.println("bigDecima6 - bigDecima7 =" |
+ bigDecima6.subtract(bigDecima7)); |
// multiply(BigDecimal multiplicand):返回一个 BigDecimal,其值为 (this × |
// multiplicand) |
System.out.println("bigDecima6 * bigDecima7 =" |
+ bigDecima6.multiply(bigDecima7)); |
// divide(BigDecimal divisor):返回一个 BigDecimal,其值为 (this / divisor) |
System.out.println("bigDecima6 / bigDecima7 =" |
+ bigDecima6.divide(bigDecima7)); |
// pow(int n):返回其值为 (this^n) 的 BigDecimal |
System.out.println("bigDecima6^3 =" + bigDecima7.pow(3)); |
System.out.println("------转为基本数据类型--------"); |
// byteValue():将此对象转换为类型byte后表示的数值。 |
byte byteValue = bigDecima6.byteValue(); |
short shortValue = bigDecima6.shortValue(); |
int intValue = bigDecima6.intValue(); |
long longValue = bigDecima6.longValue(); |
float floatValue = bigDecima6.floatValue(); |
double doubleValue = bigDecima6.doubleValue(); |
System.out.println("byteValue =" + byteValue); |
System.out.println("shortValue =" + shortValue); |
System.out.println("intValue =" + intValue); |
System.out.println("longValue =" + longValue); |
System.out.println("floatValue =" + floatValue); |
System.out.println("doubleValue =" + doubleValue); |
// toString():返回此 BigDecimal 的字符串表示形式,如 果需要指数,则使用科学记数法。 |
String string = bigDecima6.toString(); |
System.out.println("string =" + string); |
System.out.println("---演示浮点型的精度丢失问题---"); |
System.out.println(0.2 + 0.1); |
System.out.println(0.3 - 0.1); |
System.out.println(0.2 * 0.1); |
System.out.println(0.3 / 0.1); |
//原因在于计算机是二进制的。浮点数没有办法是用二进制进行精确表示。CPU表示浮点数 |
//由两个部分组成:指数和尾数,这样的表示方法一般都会失去一定的精确度,有些浮点数运 |
//算也会产生一定的误差。如:2.4的二进制表示并非就是精确的2.4。反而最为接近的二进 |
//制表示是 2.3999999999999999。浮点数的值实际上是由一个特定的数学公式计算得到的。 |
// BigDecimal构造方法 |
// 1.public BigDecimal(double val) 将double表示形式转换为BigDecimal *不建议使用 |
// 2.public BigDecimal(int val) 将int表示形式转换成BigDecimal |
// 3.public BigDecimal(String val) 将String表示形式转换成BigDecimal |
BigDecimal bString = new BigDecimal("6.3"); |
BigDecimal bigDecimal6 = new BigDecimal(5); |
BigDecimal bDouble = new BigDecimal(6.3); |
System.out.println("bigDecimal6=" + bigDecimal6); |
System.out.println("bDouble=" + bDouble); |
System.out.println("bString=" + bString); |
//参数类型为double的构造方法的结果有一定的不可预知性。有人可能认为在Java中写入newBigDecimal(0.1) |
//所创建的BigDecimal正好等于 0.1(非标度值 1,其标度为 1),但是它实际上等于0.1000000000000000055511151231257827021181583404541015625。 |
//这是因为0.1无法准确地表示为 double(或者说对于该情况,不能表示为任何有限长度的二进制小数)。这样,传入 |
//到构造方法的值不会正好等于 0.1(虽然表面上等于该值)。 |
//另一方面,String 构造方法是完全可预知的:写入 newBigDecimal("0.1") 将创建一个 BigDecimal, |
//它正好等于预期的 0.1。因此,比较而言,通常建议优先使用String构造方法。 |
} |
} |
运行结果:
bigDecimal:56000 |
bigDecimal2:56000 |
bigDecimal3:56000 |
bigDecimal4:56000 |
bigDecimal5:56000 |
bigDecima6=56000.0 |
bigDecima7=5600 |
bigDecima6.abs()=56000.0 |
bigDecima6 + bigDecima7 =61600.0 |
bigDecima6 - bigDecima7 =50400.0 |
bigDecima6 * bigDecima7 =313600000.0 |
bigDecima6 / bigDecima7 =10.0 |
bigDecima6^3 =175616000000 |
------转为基本数据类型-------- |
byteValue =-64 |
shortValue =-9536 |
intValue =56000 |
longValue =56000 |
floatValue =56000.0 |
doubleValue =56000.0 |
string =56000.0 |
---演示浮点型的精度丢失问题--- |
0.30000000000000004 |
0.19999999999999998 |
0.020000000000000004 |
2.9999999999999996 |
bigDecimal6=5 |
bDouble=6.29999999999999982236431605997495353221893310546875 |
bString=6.3 |