java中BigDecimal的学习

干着java的活,但是看的都是一些偏底层的东西(或者我根本就没有看),有点荒废了java的学习。

最近一直在用到一个类是BigDecimal,但都是模棱两可地在那儿用,并没有深入研究这个类的细节,感觉不能再拖了。

BigDecimal,从名字来看就是进行大数运算的,不光这样,还广泛用于小数的精确运算。

当你接触到和钱有关的计算的时候,这个类还是很有用滴。

先来看一个例子

 1 package com.tuhooo.bigdecimal;
 2
 3 /**
 4  * Created by tuhooo on 2017/8/21.
 5  */
 6 public class Demo1 {
 7     public static void main(String[] args) {
 8         System.out.println(0.06 + 0.01);
 9         System.out.println(1.002 - 0.4);
10         System.out.println(4.015 * 100);
11         System.out.println(333.1 / 500);
12     }
13 }

讲道理,上面的运算都还没有涉及到无限循环小数呢,但是计算机给出的计算结果却是这样滴:

其实原因很简单,计算机的表示数的精度是有限滴,计算机底层用二进制来表示数据的时候,尤其是小数的时候精度更不好。

think about that,尼玛,这种运算要是出现在和钱有关的地方,说高达上点就是金融有关的话,是不能接受的。

java中提供了一个很好的类——BigDecimal来解决这个问题。

 1 package com.tuhooo.bigdecimal;
 2
 3 import java.math.BigDecimal;
 4
 5 /**
 6  * Created by tuhooo on 2017/8/21.
 7  */
 8 public class Demo2 {
 9     public static void main(String[] args) {
10         System.out.println(new BigDecimal("0.06").add(new BigDecimal("0.01")));
11         System.out.println(new BigDecimal("1.002").subtract(new BigDecimal("0.4")));
12         System.out.println(new BigDecimal("4.015").multiply(new BigDecimal("100")));
13         System.out.println(new BigDecimal("333.1").divide(new BigDecimal("500")));
14     }
15 }

看接下来的效果:

再来看一个例子:

 1 package com.tuhooo.bigdecimal;
 2
 3 import java.math.BigDecimal;
 4
 5 /**
 6  * Created by tuhooo on 2017/8/21.
 7  */
 8 public class Demo3 {
 9     public static void main(String[] args) {
10         System.out.println(new BigDecimal(0.06).add(new BigDecimal(0.01)));
11         System.out.println(new BigDecimal(1.002).subtract(new BigDecimal(0.4)));
12         System.out.println(new BigDecimal(4.015).multiply(new BigDecimal(100)));
13         System.out.println(new BigDecimal(333.1).divide(new BigDecimal(500)));
14     }
15 }

这里可以发现,并不是用了BigDecimal就会有效果的,和BigDecimal的构造方式也有关系

to be continued......

时间: 2024-12-25 13:18:01

java中BigDecimal的学习的相关文章

Java中BigDecimal的8种舍入模式是怎样的

Java中BigDecimal的8种舍入模式是怎样的?下面长沙欧柏泰克软件学院和大家一起来学习下吧:  java.math.BigDecimal 不可变的.任意精度的有符号十进制数.BigDecimal 由任意精度的整数非标度值和32位的整数标度(scale)组成. 如果为零或正数,则标度是小数点后的位数.如果为负数,则将该数的非标度值乘以10的负scale次幂. 因此,BigDecimal表示的数值是(unscaledValue × 10-scale). 与之相关的还有两个类: java.ma

Java中String类学习总结

java中String类的使用频率非常高,本人在学习此模块时,认为下列几点知识值得注意: 一.String是不可变对象 java.lang.String类使用了final修饰,不能被继承.Java程序中的所有字面值,即双引号括起的字符串,如"abc",都是作为String类的实例实现的.String是常量,其对象一旦构造就不能再被改变.换句话说,String对象是不可变的,每一个看起来会修改String值的方法,实际上都是创造了一个全新的String对象,以包含修改后的字符串内容.而最

java中BigDecimal加减乘除基本用法

Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算.双精度浮点型变量double可以处理16位有效数. 在实际应用中,需要对更大或者更小的数进行运算和处理.float和double只能用来做科学计算或者是工程计算,在商业计算中要用java.math.BigDecimal. BigDecimal所创建的是对象,我们不能使用传统的+.-.*./等算术运算符直接对其对象进行数学运算,而必须调用其相对应的方法. 方法中的参数也必须是BigDeci

[java] java 中Unsafe类学习

java不能直接访问操作系统底层,而是通过本地方法来访问.Unsafe类提供了硬件级别的原子操作,主要提供了以下功能: 1.通过Unsafe类可以分配内存,可以释放内存: 类中提供的3个本地方法allocateMemory.reallocateMemory.freeMemory分别用于分配内存,扩充内存和释放内存,与C语言中的3个方法对应. 2.可以定位对象某字段的内存位置,也可以修改对象的字段值,即使它是私有的: public native long allocateMemory(long l

Java中emum的学习总结

一.通常的定义常量的方法 <span style="font-size:14px;">public class Sex{ public final static int MALE = 1; public final static int FEMALE=2; }</span> 使用的时候,你可以在程序中直接引用这些常量.但是,这种方式还是存在着一些问题. 类型不安全 由于颜色常量的对应值是整数形,所以程序执行过程中很有可能给颜色变量传入一个任意的整数值,导致出现错

Java中enum的学习总结

一.通常的定义常量的方法 public class Sex{ public final static int MALE = 1; public final static int FEMALE=2; } 使用的时候,你能够在程序中直接引用这些常量.可是.这样的方式还是存在着一些问题. 类型不安全 因为颜色常量的相应值是整数形.所以程序运行过程中非常有可能给颜色变量传入一个随意的整数值.导致出现错误. 没有命名空间 因为颜色常量仅仅是类的属性,当你使用的时候不得不通过类来訪问. 一致性差 由于整形枚

java中继承关系学习小结

继承:把多个类中相同的内容提取出来,定义到一个类中,其他类只需要继承该类,就可以使用该类公开的属性和公开的方法. 继承的好处:提高代码的复用性.提高代码的可维护性.让类与类之间产生关系,是多态存在的一个前提. 继承的弊端:提高了类与类之间的耦合性. 开发的原则:低耦合,高内聚 耦合:类与类之间的关系 内聚:自己单独完成某件事情的能力. 在Java中只允许单继承.一个类如果没有显示的继承其他类,则该类的默认父类为Object类.Object类是所有类的父类. Java支持多层继承. 父类的公开方法

Java中的IO学习总结

今天刚刚看完java的io流操作,把主要的脉络看了一遍,不能保证以后使用时都能得心应手,但是最起码用到时知道有这么一个功能可以实现,下面对学习进行一下简单的总结: IO流主要用于硬盘.内存.键盘等处理设备上得数据操作,根据处理数据的数据类型的不同可以分为:字节流(抽象基类为InPutStream和OutPutStream)和字符流(抽象基类为Reader和Writer).根据流向不同,可以分为:输入流和输出流.  其中主要结构可以用下图来表示: 字符流和字节流的主要区别: 1.字节流读取的时候,

Java中多线程的学习和使用(一)概述及创建方式

转载请注明http://www.cnblogs.com/devtrees/p/4395477.html 多线程的学习 一.多线程概述 (一).进程与线程 在说多线程或者线程之前,让我们来了解一下更显而易见的进程概念.那什么是进程呢? 进程就是正在进行中的程序. Windows操作系统中在任务栏处右击,弹出的菜单中可看见任务管理器,打开它,就可以看见当前运行的程序和进程列表. 进程:是一个正在执行中的程序. 每一个进程执行都有一个执行顺序.该顺序是一个执行路径,或者叫一个控制单元. 线程:就是进程