参加工作之后发现公司项目的数据库有关数值的字段类型,很少是之前常用的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

     

以上

BigDecimal 详细解析的更多相关文章

  1. java类生命周期详细解析

    (一)详解java类的生命周期 引言 最近有位细心的朋友在阅读笔者的文章时,对java类的生命周期问题有一些疑惑,笔者打开百度搜了一下相关的问题,看到网上的资料很少有把这个问题讲明白的,主要是因为目前 ...

  2. springmvc 项目完整示例06 日志–log4j 参数详细解析 log4j如何配置

    Log4j由三个重要的组件构成: 日志信息的优先级 日志信息的输出目的地 日志信息的输出格式 日志信息的优先级从高到低有ERROR.WARN. INFO.DEBUG,分别用来指定这条日志信息的重要程度 ...

  3. include_path详细解析

    include_path详细解析     原文地址:http://www.laruence.com/2010/05/04/1450.html 1.php默认的包含路径为 .;C:\php\pear 即 ...

  4. Intent的详细解析以及用法

    Intent的详细解析以及用法      Android的四大组件分别为Activity .Service.BroadcastReceiver(广播接收器).ContentProvider(内容提供者 ...

  5. C++多态的实现及原理详细解析

    C++多态的实现及原理详细解析 作者: 字体:[增加 减小] 类型:转载   C++的多态性用一句话概括就是:在基类的函数前加上virtual关键字,在派生类中重写该函数,运行时将会根据对象的实际类型 ...

  6. 对MySQL DELETE语法的详细解析

    以下的文章主要描述的是MySQL DELETE语法的详细解析,首先我们是从单表语法与多表语法的示例开始的,假如你对MySQL DELETE语法的相关内容十分感兴趣的话,你就可以浏览以下的文章对其有个更 ...

  7. 转:二十一、详细解析Java中抽象类和接口的区别

    转:二十一.详细解析Java中抽象类和接口的区别 http://blog.csdn.net/liujun13579/article/details/7737670 在Java语言中, abstract ...

  8. 单表扫描,MySQL索引选择不正确 并 详细解析OPTIMIZER_TRACE格式

    单表扫描,MySQL索引选择不正确 并 详细解析OPTIMIZER_TRACE格式     一 表结构如下:  万行 CREATE TABLE t_audit_operate_log (  Fid b ...

  9. 在PHP中使用CURL,“撩”服务器只需几行——php curl详细解析和常见大坑

    在PHP中使用CURL,"撩"服务器只需几行--php curl详细解析和常见大坑 七夕啦,作为开发,妹子没得撩就"撩"下服务器吧,妹子有得撩的同学那就左拥妹子 ...

随机推荐

  1. C#调用SendMessage 用法

    函数功能:该函数将指定的消息发送到一个或多个窗口.此函数为指定的窗口调用窗口程序,直到窗口程序处理完消息再返回.该函数是应用程序和应用程序之间进行消息传递的主要手段之一.    函数原型:LRESUL ...

  2. 明显调用的表达式前的括号必须具有(指针)函数类型 编译器错误 C2064

    看到“明显调用的表达式前的括号必须具有(指针)函数类型”这句时我才发现我的语文水平有多烂,怎么看都看不懂,折腾了半天才知道是哪里出了问题. 举个简单的例子 class CTest { void (CT ...

  3. 高性能 TCP & UDP 通信框架 HP-Socket v3.3.1

    HP-Socket 是一套通用的高性能 TCP/UDP 通信框架,包含服务端组件.客户端组件和 Agent 组件,广泛适用于各种不同应用场景的 TCP/UDP 通信系统,提供 C/C++.C#.Del ...

  4. GJM : Unity3D HIAR -【 快速入门 】 二、搭建开发环境

    感谢您的阅读.喜欢的.有用的就请大哥大嫂们高抬贵手"推荐一下"吧!你的精神支持是博主强大的写作动力以及转载收藏动力.欢迎转载! 版权声明:本文原创发表于 [请点击连接前往] ,未经 ...

  5. java类与实例

    最近在看设计模式,感觉自己对java的三大特性的理解不够清晰,搞不清楚抽象类.接口.泛型的用处和优缺点.设计模式学了一半,想着还是停下来脑补一下java的基础,就从java对象开始吧. 一.java对 ...

  6. 交易系统使用storm,在消息高可靠情况下,如何避免消息重复

    概要:在使用storm分布式计算框架进行数据处理时,如何保证进入storm的消息的一定会被处理,且不会被重复处理.这个时候仅仅开启storm的ack机制并不能解决上述问题.那么该如何设计出一个好的方案 ...

  7. Less配置环境

    一.安装Sublime 插件 1.安装Less插件: ctrl+shift+p>install Package>输入less按Enter 2.安装Less2CSS插件:ctrl+shift ...

  8. Array&String总结

    每一部分总结后有实例代码,代码中黄色框方法不改变原数组.PS:所有实例结果均一一运行所得. 符号说明: array和string共享    参数 Array --普通方法 栈:   pop()   p ...

  9. 打造自定Select样式

    打造自定Select样式 我们为什么要自定义select样式? 1.select最大的一个缺陷就是不能自定义下拉按钮的样式. 效果图: 在线演示地址: http://www.smallui.com/j ...

  10. Android中使用GridView和ImageViewSwitcher实现电子相册简单功能

    我们在手机上查看相册时,首先看到的是网格状的图片展示界面,然后我们选择想要欣赏的照片点击进入,这样就可以全屏观看该照片,并且可以通过左右滑动来切换照片.如下图的显示效果: 首先我们先罗列一下本次实现所 ...