当使用double进行商业运算时,double计算会丢失精度。可以使用BigDecimal进行计算。

  1. import java.math.BigDecimal;
  2. import org.junit.Test;
  3. public class TestBigDecimal{
  4. @Test
  5. public void test(){
  6. double a=0.1;
  7. double b=0.2;
  8. System.out.println(a+b);
  9. BigDecimal a1=new BigDecimal("0.1");
  10. BigDecimal b1=new BigDecimal("0.2");
  11. System.out.println(a1+b1);
  12. BigDecimal c1=new BigDecimal("0.23574");
  13. a1=a1.add(c1);
  14. a1=a1.setScale(1,BigDecimal.ROUND_DOWN);
  15. System.out.println(a1);
  16. }
  17. }
import java.math.BigDecimal;
import org.junit.Test;
public class TestBigDecimal{
@Test
public void test(){
double a=0.1;
double b=0.2;
System.out.println(a+b);
  BigDecimal a1=new BigDecimal("0.1");

  BigDecimal b1=new BigDecimal("0.2");

  System.out.println(a1+b1);//不要这么写
System.out.println(a1.add(b1));//正确
BigDecimal c1=new BigDecimal("0.23574");
a1=a1.add(c1);
a1=a1.setScale(1,BigDecimal.ROUND_DOWN);
System.out.println(a1);

}

}

输出结果如下:

0.30000000000000004

0.3

0.3

double的加减无法精确计算出0.3,而使用BigDecimal却可以。

当然,如果直接将double传给BigDecimal,你会发现不但无法解决精度问题,反而对精度进行了补全。所以,为确保精度,我们将String传给它。

BigDecimal.setScale()方法用于格式化小数点

setScale(1)表示保留一位小数,默认用四舍五入方式

setScale(1,BigDecimal.ROUND_DOWN)直接删除多余的小数位,如2.35会变成2.3

setScale(1,BigDecimal.ROUND_UP)进位处理,2.35变成2.4

setScale(1,BigDecimal.ROUND_HALF_UP)四舍五入,2.35变成2.4
setScaler(1,BigDecimal.ROUND_HALF_DOWN)四舍五入,2.35变成2.3,如果是5则向下舍

.scale()  取精度值,即小数点后位数(注:BigDecimal可以通过setScale来提高精度,只要新设的值比原来的大!

BigDecimal也可以通过setScale来降低精度。因为新设的值比原来的小,所以必须保证原来数值的该位小数点后面都是0,只有这样才可以设比原来小的精度。

例:原来的值是:4.1235648,想把scale设为小于7为都会出错的,如果原来的值是:4.1235000,把scale设为小于4位会出错,而设为4、5、6、7都没有问题,设得更大,肯定不会出错)

add(BigDecimal)        BigDecimal对象中的值相加,然后返回这个对象。

subtract(BigDecimal) BigDecimal对象中的值相减,然后返回这个对象。

multiply(BigDecimal)  BigDecimal对象中的值相乘,然后返回这个对象。

divide(BigDecimal)     BigDecimal对象中的值相除,然后返回这个对象。

BigDecimal divide(BigDecimal divisor, int scale, int roundingMode)

例:BigDecimal mData = new BigDecimal("9.655").setScale(2, BigDecimal.ROUND_HALF_UP);

----结果:----- mData=9.66

toString()                将BigDecimal对象的数值转换成字符串。

doubleValue()          将BigDecimal对象中的值以双精度数返回。

floatValue()             将BigDecimal对象中的值以单精度数返回。

longValue()             将BigDecimal对象中的值以长整数返回。

intValue()               将BigDecimal对象中的值以整数返回。

金融项目java开发_BigDecimal(解决计算精度问题)的更多相关文章

  1. [ JAVA编程 ] double类型计算精度丢失问题及解决方法

    前言 如果你在测试金融相关产品,请务必覆盖交易金额为小数的场景.特别是使用Java语言的初级开发. Java基本实例 先来看Java中double类型数值加.减.乘.除计算式实例: public cl ...

  2. JavaScript中解决计算精度丢失的问题

    在做项目之前老师就给我们封装好了一个js文件,解决计算中丢失精度的一些函数,直接引用js文件就可以使用. eg: var numA = 0.1; var numB = 0.2; alert( numA ...

  3. 解决计算精度问题:BigDecimal

    BigDecimal类 BigDecimal所在包:java.math,不可变的.任意精度的有符号十进制数.BigDecimal 由任意精度的整数非标度值 和 32 位的整数标度 (scale) 组成 ...

  4. Java开发中解决Js的跨域问题

    主流方法有JSONP和CORS两种,这里记一下后者的方式,理论基础就是在请求的时候在http请求头中添加如下属性: //指定允许其他域名访问 Access-Control-Allow-Origin:h ...

  5. Ubuntu下eclipse不能新建java项目 java project的解决办法

    在ubuntu系统中,装了eclipse,打开过,后来装了JDK,却不能新建java项目.重装了几遍eclipse也没有用. 原因分析: 之所以新建找不到java项目是因为eclipse有残留文件导致 ...

  6. 今日成长笔记2016-11-18 - 关于java开发

    好久没有写今日成长笔记了,要记得上一次写笔记还是2016-09-05,今天心血来潮,写一写最近发生在自己身上的事情,以后我要坚持每天写日记.我承认自己身上的确或多或少的存在不足,现在把它们抛出来,并记 ...

  7. day11<Java开发工具&常见对象>

    Java开发工具(常见开发工具介绍) Java开发工具(Eclipse中HelloWorld案例以及汉化) Java开发工具(Eclipse的视窗和视图概述) Java开发工具(Eclipse工作空间 ...

  8. 分享:Java 开发精美艺术二维码

    博客地址:https://ainyi.com/58 Java 开发精美艺术二维码 看到网络上各种各样的二维码层出不穷,好像很炫酷的样子,一时兴起,我也要制作这种炫酷二维码效果 例如: 根据以往例子 根 ...

  9. 0.1+0.2不等于0.3,微信小程序云开发如何解决JavaScript小数计算精度失准的问题

    先看图 这个是JavaScript语言自身存在的一个问题.说道这里不得不提一下网上流传的JavaScript搞笑图 我们在使用云开发来开发微信小程序的时候,会经常遇到JavaScript小数计算精度失 ...

随机推荐

  1. 【原创】关于class.forname

    连接数据库前都要调用一下class.forname("driverName");然后使用DriverMnager获取连接,这是为什么呢? 首先jdbc标准要求,每个驱动必须向Dri ...

  2. Thread Control Block

    Thread Control Block The following is the declaration of the Thread Control Block. struct tcb { u32_ ...

  3. 洛谷P1136 迎接仪式 动态规划

    显然,这是一道动归题. 我们发现,每次交换时只可能交换不同的字母(交换同类字母显然是没有意义的).那么每次交换等同于将 111 个 "j""j""j& ...

  4. Spring jar包功能

    1.spring.jar 是包含有完整发布模块的单个jar 包. 2. org.springframework.aop 包含在应用中使用Spring的AOP特性时所需的类. 3. org.spring ...

  5. 转载git的使用

    版权声明:本文为博主原创文章,未经博主允许不得转载.转载请注明原地址 转载请注明出处!谢谢 1.安装Git:Ctrl + Alt + T使用终端:使用命令 [plain] view plain cop ...

  6. Python学习————列表的增删改查

    增加:li.append(对象):追加 注:print(li.append())--->是Noneli.insert(索引,对象):插入到相应位置li.extend(对象):可迭代的添加到尾部, ...

  7. 紫书 习题 8-17 UVa 11536 (滑动窗口)

    这道题说连续子序列, 马上就想到滑动窗口. 注意窗口里面的元素中小于等于k的才是有效元素.记录窗口里面有效元素的个数, 满足了之后开始 缩短窗口, 如果左端点不是有效元素或者即使窗口中存在这个元素的个 ...

  8. [Javascript] String Padding in Javascript using padStart and padEnd functions

    ES2017 added two new string functions. They are padStart and padEndfunctions. In this lesson, we wil ...

  9. [Typescript] Promise based delay function using async / await

    Learn how to write a promise based delay function and then use it in async await to see how much it ...

  10. 兔子--Android Support v4包丢失的解决的方法

    在开发中,Android Support v4包丢失的解决的方法: Project->properties->Java Build Path->Libraries->Add E ...