BigDecimal 详细解析

  参加工作之后发现公司项目的数据库有关数值的字段类型,很少是之前常用的float和double,

而是一个没有接触过的decimal,在Java中表示的类型为BigDecimal,

而在业务中常常有关BigDecimal的加减乘除运算,所以查了一下资料,做了如下总结。

1.前言

  Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。

  双精度浮点型变量double可以处理16位有效数。

  float和double主要用来处理科学计算和工程计算,

  在实际应用中,特别是商业计算往往要求结果更加精确。运用BigDecimal可以很方便的解决这个问题。

2.构造方法

  BigDecimal  a = new BigDecimal();

  BigDecimal一共有4个构造方法

  BigDecimal(int) 创建一个具有参数所指定整数值的对象。

  BigDecimal(double) 创建一个具有参数所指定双精度值的对象。

  BigDecimal(long) 创建一个具有参数所指定长整数值的对象。

  BigDecimal(String) 创建一个具有参数所指定以字符串表示的数值的对象。

  特别注意:

    double a = 0.1;

    所创建的new BigDecimal(a);并不正好等一0.1,而是                                 0.1000000000000000055511151231257827021181583404541015625

    这是因为doule不能表示为任何有限长度的二进制小数。

    String b = "0.1";

    所创建的new BigDecimal(b),正好等于0.1.            

3.运算方式

  因为BigDecimal是一个对象,不同于double,float等基本类型可以通过运算符+,—,*,/等做运算,

  其有自己的运算方法:

  BigDecimal add(BigDecimal augend) 加法运算

  BigDecimal subtract(BigDecimal subtrahend) 减法运算

  BigDecimal multiply(BigDecimal multiplicand) 乘法运算

  BigDecimal divide(BigDecimal divisor) 除法运算

  举例:

    BigDeciaml a = new BigDeciaml("1");

    BigDeciaml b = new BigDeciaml("2");

    a.add(b);

    system.out.println("a="+a);

    大家很容易认为会输出a=3,其实是a=1;

    其实BigDecimal的加减乘除方法都是返回一个新的BigDeciaml对象,

    所以:

    BigDecimal c = a.add(b);

    system.out.println("c="+c);//c=3

     

以上

时间: 2024-08-25 13:40:52

BigDecimal 详细解析的相关文章

JFinal 源码超详细解析之DB+ActiveRecord

我记得以前有人跟我说,"面试的时候要看spring的源码,要看ioc.aop的源码"那为什么要看这些开源框架的源码呢,其实很多人都是"应急式"的去读,就像读一篇文章一下,用最快的速度把文章从头到尾读一遍,那结果就是当你读完它,你也不清楚它讲了一个什么故事,想表达什么. 一个优秀的架构的源码我认为就好像一本名著一样,你的"文学"水平越高,你就越能读出作者设计的精妙之处.一篇源码在你不同水平的时候,能读出不同的东西,因此,我觉得优秀的框架的源码是经久

linux中的压缩命令详细解析(二)

我们在<Linux中的压缩命令详细解析(一)>中已经讲解了常见的三种压缩命令,下面我们开始讲解工作中最常用到的tar命令. 为了使压缩和解压缩变得简单,tar命令就应运而生了.那么究竟该如何使用呢? tar.gz格式: 压缩命令: tar -zcvf 压缩文件名 源文件名 举例: 把abc文件压缩成后缀为tar.gz格式的文件 tar -zcvf abc.tar.gz abc 解压缩命令: 举例:解压缩abc.tar.gz文件 tar -zxvf abc.tar.gz tar.bz2格式: 压

【转】UML中的几种关系详细解析

UML图中类之间的关系:依赖,泛化,关联,聚合,组合,实现 类与类图 1) 类(Class)封装了数据和行为,是面向对象的重要组成部分,它是具有相同属性.操作.关系的对象集合的总称. 2) 在系统中,每个类具有一定的职责,职责指的是类所担任的任务,即类要完成什么样的功能,要承担什么样的义务.一个类可以有多种职责,设计得好的类一般只有一种职责,在定义类的时候,将类的职责分解成为类的属性和操作(即方法). 3) 类的属性即类的数据职责,类的操作即类的行为职责 一.依赖关系(Dependence) 依

字符数组的定义与使用详细解析

1. 字符数组的定义: 用来存放字符量的数组称为字符数组. 形式数值数组相同.例如: char c[10]; 由于字符型和整型通用,也可以定义为int c[10],但这时每个数组元素占2个字节的内存单元. 字符数组也可以是二维或多维数组.例如: char c[5][10]; 即为二维字符数组. 2. 字符数组的初始化 第一种方法是分别对每一个元素进行赋值操作: 字符数组也允许在定义时作初始化赋值.例如: char c[10]={'c', '  ', 'p', 'r','o', 'g', 'r',

【剧透高亮】最最最完整剧透加剧情详细解析

在美国看的,IMAX大厅爆满!只能缩在角落里的位置看,但是还是不影响观影过程,被震撼到不行!看到最后黑洞的情节都快哭出来跪在地上了!Hans Zimmer的配乐太结棍了啊! 就像诺兰所有的电影一样,Interstellar是一部烧脑+解读人性+看完后需要阅读大量相关资料补课的大片!尤其是马修麦康纳那mumbling的口音简直听得人更加confused神烦啊!伐碍紧!我们来把剧情从头到尾理一遍! OK废话不多say了,直接上剧情解析   在未来的世界,由于科技太发达,人类对于能源的过度开发导致地球

Java当中的堆与栈详细解析

总结第一句话:Java语言使用内存的时候,栈内存主要保存以下内容:基本数据类型和对象的引用,而堆内存存储对象,栈内存的速度要快于堆内存.总结成一句话就是:引用在栈而对象在堆. Java疯狂讲义的一段对话作为开场白. 一个问题:为什么有栈内存和堆内存之分? 答:当一个方法执行时,每个方法都会简历自己的内存栈,在这个方法内定义的变量将会逐个放入这块栈内存里,随着方法的执行结束,这个方法的内存栈也将自然销毁.因此,所有在方法中创建一个对象时,这个对象将被保存到运行时数据区中,以便利用(因为对象的创建成

java类生命周期详细解析

(一)详解java类的生命周期 引言 最近有位细心的朋友在阅读笔者的文章时,对java类的生命周期问题有一些疑惑,笔者打开百度搜了一下相关的问题,看到网上的资料很少有把这个问题讲明白的,主要是因为目前国内java方面的教材大多只是告诉你“怎样做”,但至于“为什么这样做”却不多说,所以造成大家在基础和原理方面的知识比较匮乏,所以笔者今天就斗胆来讲一下这个问题,权当抛砖引玉,希望对在这个问题上有疑惑的朋友有所帮助,文中有说的不对的地方,也希望各路高手前来指正. 首先来了解一下jvm(java虚拟机)

iOS中中UIView头文件详细解析

@interface UIView : UIResponder<NSCoding, UIAppearance, UIAppearanceContainer, UIDynamicItem> /** *  通过一个frame来初始化一个UI控件 */ - (id)initWithFrame:(CGRect)frame; // YES:能够跟用户进行交互 @property(nonatomic,getter=isUserInteractionEnabled) BOOL userInteraction

ios申请真机调试( xcode 5)详细解析(转载)

目录[-] 第一步:申请"开发证书" 第二步:添加App IDs 第三步:申请设备 第四步:申请描述文件 第一步:申请"开发证书" 进入苹果开发者99美元账号: 选择:Certificates, Identifiers & Profiles 关于 Certificates,Identifiers,Profiles 的介绍请看 "Certificates, Identifiers ,Profiles" 选择:Certificates 选择: