作者:Java实用技术

blog.csdn.net/vbirdbest/article/details/80280627

一 简介

Java中的简单浮点数类型float和double不能够进行运算,或者运算会丢失精度,不光是Java,在其它很多编程语言中也有这样的问题。在大多数情况下,计算的结果是准确的,float和double只能用来做科学计算或者是工程计算,在商业计算中我们要用 java.math.BigDecimal

// 浮点型计算不准确示例
@Test
public void testDouble(){// 0.060000000000000005System.out.println(0.05+0.01);// 0.5800000000000001System.out.println(1.0-0.42);// 401.49999999999994System.out.println(4.015*100);// 1.2329999999999999System.out.println(123.3/100);// 4.01 四舍五入保留两位System.out.println(Math.round(4.015*100)/100.0);
}

二 BigDecimal

BigDecimal有多种构造函数,常用的有2种,其中有一种不建议使用,就是double构造方式,建议使用String构造方式。

// 强制使用String的构造函数,double也有可能计算不太准确
// 原则是使用BigDecimal并且一定要用String来够造。
public BigDecimal(String val);
public BigDecimal(double val);
BigDecimal也定义了几个常用的值,0、1、10,静态的,可以通过类名直接引用BigDecimal.ZERO
public static final BigDecimal ZERO = zeroThroughTen[0];/*** The value 1, with a scale of 0.** @since 1.5*/public static final BigDecimal ONE = zeroThroughTen[1];/*** The value 10, with a scale of 0.** @since 1.5*/public static final BigDecimal TEN = zeroThroughTen[10];
三:工具类

三 工具类

由于构造方法要用String对应的构造方法,如果我们要做一个加法运算,需要先将两个浮点数转为String,然后够造成BigDecimal,在其中一个上调用add方法,传入另一个作为参数,然后把运算的结果(BigDecimal)再转换为浮点数。你能够忍受这么烦琐的过程吗?下面我们提供一个工具类来简化操作。

import java.math.BigDecimal;
/*** 由于Java的简单类型不能够精确的对浮点数进行运算,这个工具类提供精* 确的浮点数运算,包括加减乘除和四舍五入。*/
public class ArithUtil {//默认除法运算精度private static final int DEF_DIV_SCALE = 10;/*** 提供精确的加法运算。* @param v1 被加数* @param v2 加数* @return 两个参数的和*/public static double add(double v1,double v2){BigDecimal b1 = new BigDecimal(Double.toString(v1));BigDecimal b2 = new BigDecimal(Double.toString(v2));return b1.add(b2).doubleValue();}/*** 提供精确的减法运算。* @param v1 被减数* @param v2 减数* @return 两个参数的差*/public static double sub(double v1,double v2){BigDecimal b1 = new BigDecimal(Double.toString(v1));BigDecimal b2 = new BigDecimal(Double.toString(v2));return b1.subtract(b2).doubleValue();}/*** 提供精确的乘法运算。* @param v1 被乘数* @param v2 乘数* @return 两个参数的积*/public static double mul(double v1,double v2){BigDecimal b1 = new BigDecimal(Double.toString(v1));BigDecimal b2 = new BigDecimal(Double.toString(v2));return b1.multiply(b2).doubleValue();}/*** 提供(相对)精确的除法运算,当发生除不尽的情况时,精确到* 小数点以后10位,以后的数字四舍五入。* @param v1 被除数* @param v2 除数* @return 两个参数的商*/public static double div(double v1,double v2){return div(v1,v2,DEF_DIV_SCALE);}/*** 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指* 定精度,以后的数字四舍五入。* @param v1 被除数* @param v2 除数* @param scale 表示表示需要精确到小数点以后几位。* @return 两个参数的商*/public static double div(double v1,double v2,int scale){if(scale<0){throw new IllegalArgumentException("The scale must be a positive integer or zero");}BigDecimal b1 = new BigDecimal(Double.toString(v1));BigDecimal b2 = new BigDecimal(Double.toString(v2));return b1.divide(b2,scale,BigDecimal.ROUND_HALF_UP).doubleValue();}/*** 提供精确的小数位四舍五入处理。* @param v 需要四舍五入的数字* @param scale 小数点后保留几位* @return 四舍五入后的结果*/public static double round(double v,int scale){if(scale<0){throw new IllegalArgumentException("The scale must be a positive integer or zero");}BigDecimal b = new BigDecimal(Double.toString(v));BigDecimal one = new BigDecimal("1");return b.divide(one,scale, BigDecimal.ROUND_HALF_UP).doubleValue();}
}

四 测试

@Test
public void testBigDecimal(){BigDecimal price = BigDecimal.ZERO;// 通常建议优先使用(String)构造函数BigDecimal amount = new BigDecimal("6.66");// 0.06System.out.println(ArithUtil.add(0.05, 0.01));// 0.58System.out.println(ArithUtil.sub(1.0, 0.42));// 401.5System.out.println(ArithUtil.mul(4.015, 100));// 1.233System.out.println(ArithUtil.div(123.3, 100));// 4.02System.out.println(ArithUtil.round(4.015, 2));// BigDecimal 比较大小使用compareTo方法// public int compareTo(BigDecimal val);
}

猜你喜欢

1、GitHub 标星 3.2w!史上最全技术人员面试手册!FackBoo发起和总结

2、如何才能成为优秀的架构师?

3、从零开始搭建创业公司后台技术栈

4、程序员一般可以从什么平台接私活?

5、37岁程序员被裁,120天没找到工作,无奈去小公司,结果懵了...

6、滴滴业务中台构建实践,首次曝光

7、不认命,从10年流水线工人,到谷歌上班的程序媛,一位湖南妹子的励志故事

8、15张图看懂瞎忙和高效的区别!

涉及金钱使用double的已经被公司开除了,要使用BigDecimal相关推荐

  1. bigdecimal不保留小数_金钱要使用BigDecimal数据类型(使用double的已经被公司开除了)...

    一:简介 Java中的简单浮点数类型float和double不能够进行运算,或者运算会丢失精度,不光是Java,在其它很多编程语言中也有这样的问题.在大多数情况下,计算的结果是准确的,float和do ...

  2. 开公司的两个方向,要么把公司开成很赚钱,要么把公司做成很值钱

    开公司的两个方向,要么把公司开成很赚钱,要么把公司做成很值钱. 淘客卖货领域里做得好的,基本上是赚钱型的公司. 对于做淘客卖货,我一直保留一个观点:别看太长远,能看未来一年就很好了,就怕那种进入淘客领 ...

  3. 杭州一公司开20万月薪抢AIGC算法工程师;SpaceX「星舰」发射任务失败;华为宣布实现ERP自主可控,突破封锁|极客头条

    「极客头条」-- 技术人员的新闻圈! CSDN 的读者朋友们早上好哇,「极客头条」来啦,快来看今天都有哪些值得我们技术人关注的重要新闻吧. 整理 | 梦依丹 出品 | CSDN(ID:CSDNnews ...

  4. 杭州一公司开20万月薪抢AIGC算法工程师;SpaceX「星舰」发射任务失败;华为宣布实现ERP自主可控,突破封锁|极客头条...

    「极客头条」-- 技术人员的新闻圈! CSDN 的读者朋友们早上好哇,「极客头条」来啦,快来看今天都有哪些值得我们技术人关注的重要新闻吧. 整理 | 梦依丹 出品 | CSDN(ID:CSDNnews ...

  5. 不要告诉同事你要离职!打算跳槽,新公司开出两倍薪资,私下告诉要好的同事,却被同事出卖给领导!...

    职场上有真正的朋友吗?来看看这位网友的讲述: 一位前同事本来打算跳槽,新公司开出的薪资是原来的两倍.她私下告诉了几位同事自己打算离职的消息,并跟同事们分享了工资翻倍的喜悦.可她万万没想到,两天之后的公 ...

  6. 接私活被公司开除了。。。

    点击上方[全栈开发者社区]→右上角[...]→[设为星标⭐ 点击领取全栈资料:全栈资料 各位 大佬,接私活也得小心了,别被抓住把柄.. 2019年8月15日,因员工李某在合资公司接私活,九次方大数据信 ...

  7. 天猫双十一、小米MIX和讯飞输入法:中国大公司开玩“近创新”

    天猫双11全天交易额落在了1207亿这个数字上,比我预期中少了一点.不过,天猫双11依然给我带来了很大的震撼--不是数字,而是我在双11媒体中心24小时看到的点点滴滴. 有人说,双11是中国的黑色星期 ...

  8. 被抖音公司开除了....

    阅读本文大概需要9分钟. 上周我的一个读者紧急求助,原因是他毕业入职头条没多久就被裁员了: 问了下这个同学工作还没到半年就遇到了部门大调整. 简单安抚了下,拿到他的简历发给了几个认识的大厂大佬,然后给 ...

  9. 跨国企业在中国 | 3M与美的达成家电领域战略合作;舍弗勒南京公司开建新厂房...

    摘要 3M.富士胶片.麦德龙.皇家宠物食品.拜耳.罗氏制药.阿斯利康.霍尼韦尔.舍弗勒.假日酒店.希尔顿等跨国企业在中国业务发展最新资讯. 消费者科技 3M与美的达成家电领域创新战略合作 8月23日, ...

  10. 要不是这些沙雕插件,我早就被公司开除了。

    点击上方"民工哥技术之路"选择"置顶或星标" 每天10点为你分享不一样的干货 转载自微信公众号:差评(chaping321),已获得差评官方的授权,转载请联系官 ...

最新文章

  1. Windows PE第6章 栈与重定位表
  2. Visual Studio 2017 图文安装流程
  3. 【C++】利用Visual Studio 2008编写C++,Visual Studio 2008的基本使用
  4. webapi+ajax跨域问题及cookie设置
  5. FusionCharts使用问题及解决方法(三)-FusionCharts常见问题大全
  6. C#(WPF)为Grid添加实线边框。
  7. matlab求抛物问题,高手进,用matlab求解一维抛物方程的初边值问题 - 数学 - 小木虫 - 学术 科研 互动社区...
  8. vue+django实现下载文件
  9. java yyyymmdd 的date_用Java解析YYYYMMdd日期的最快方法
  10. 接口文档要写在概要设计里吗_概要设计报告怎么写
  11. 造成服务器不稳定的原因有哪些
  12. oracle中查找执行效率低下的SQL
  13. ZooKeeper JMX enabled by default
  14. 灰度发布:灰度很简单,发布很复杂
  15. Mac 卸载/安装 maven
  16. 微信图片去除马赛克_照片怎么去水印,去除图片水印的简朴方式,微信公众号引流的21种方法...
  17. 四、WebScada-OSHMI的Modbus采集
  18. LUN 是个什么东西
  19. 【图表示学习】Graph Representation Learning 读书笔记(一)
  20. cocos creator 加速器实现

热门文章

  1. React Native : AsyncStorage 存储
  2. @SuppressWarnings注解的详解
  3. the third assignment of software testing
  4. RouterOS 端口映射与回流
  5. Linux基础-获取命令帮助与命令的查找(1)
  6. 禁止谷歌浏览器对form元素添加缓存默认值
  7. CToolTipCtrl使用详细解说
  8. 「leetcode」463. 岛屿的周长【模拟便可】详解
  9. 高效使用 Mac Dock 的炫酷技巧
  10. SQLPro Studio for Mac(数据库管理器)2022.14