资讯专栏INFORMATION COLUMN

Double精度丢失解决方案《浅谈BigDecimal》

icattlecoder / 2068人阅读

摘要:错误将导致不能涨薪。如果未指定舍入模式,并且无法表示准确结果,则抛出一个异常否则,通过向该操作提供适当的对象,可以对已选择的精度和舍入模式执行计算。使用此类例如,中的整数字段来表示舍入模式已过时应改为使用例如,的枚举值。

为什么金额要使用BigDecimal而不使用Double?

在电商或者金融行业,看似很小的误差但是通过一番计算后会导致很大的误差,误差将演变为错误。错误将导致不能涨薪。
BigDecimal 类提供以下操作:算术、标度操作、舍入、比较、哈希算法和格式转换

1. double精度丢失示例
例1:
 Double d1 = 1.0000001;
 Double d2 = 0.000002;
 //理想输出1.0000021,实际输出1.0000021000000001
 System.out.println(d1+d2);
 //实际输出1.0000021  理想输出1.0000021
 System.out.println(new BigDecimal(d1.toString()).add(new     BigDecimal(d2.toString())));
 例2:
 Double d3 = 11540d;
 Double d4 = 0.35;
 //实际输出4038.9999999999995 理想输出4039
 System.out.println(d3*d4);
 //实际输出4039.000 理想输出4039
 System.out.println(new BigDecimal(d3.toString()).multiply(new BigDecimal(d4.toString())));
2. BigDecimal的基本使用
BigDecimal decimal =  new BigDecimal("1.3");
BigDecimal decimal1 =  new BigDecimal("3.32");
//加
System.out.println(decimal.add(decimal1));
//减
System.out.println(decimal1.subtract(decimal));
//乘
System.out.println(decimal1.multiply(decimal));
//除
System.out.println(decimal1.divide(decimal,2,BigDecimal.ROUND_CEILING ));
3. BigDecimal精度处理类型

BigDecimal 类使用户能完全控制舍入行为。如果未指定舍入模式,并且无法表示准确结果,则抛出一个异常;否则,通过向该操作提供适当的 MathContext 对象,可以对已选择的精度和舍入模式执行计算。在任何情况下,可以为舍入控制提供八种舍入模式。使用此类(例如,ROUND_HALF_UP)中的整数字段来表示舍入模式已过时;应改为使用 RoundingMode enum(例如,RoundingMode.HALF_UP)的枚举值。
八种舍入模式:

  CEILING 向正无限大方向舍入的舍入模式。 
  DOWN 向零方向舍入的舍入模式。 
  FLOOR 向负无限大方向舍入的舍入模式。 
  HALF_DOWN  向最接近数字方向舍入的舍入模式,如果与两个相邻数字的距离相等,则向下舍入。 
  HALF_EVEN 向最接近数字方向舍入的舍入模式,如果与两个相邻数字的距离相等,则向相邻的偶数舍入。 
  HALF_UP  向最接近数字方向舍入的舍入模式,如果与两个相邻数字的距离相等,则向上舍入 
  UNNECESSARY 用于断言请求的操作具有精确结果的舍入模式,因此不需要舍入。 
  UP 远离零方向舍入的舍入模式。 

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/75906.html

相关文章

  • 拯救你丢失精度——BigInteger和BigDecimal类(入门)

    摘要:返回的是是一个整数的最小值。笔记这个构造函数的结果可能有些不可预测。这是因为不能像或者作为任何有限长度的二进制分数精确地表示。当必须用作源为,注意,此构造提供了一个精确的转换它不会将转换为使用方法,然后使用构造函数相同的结果。 第三阶段 JAVA常见对象的学习 BigInteger和BigDecimal类 BigInteger类 (一) 构造方法: //针对超过整数范围的运算(整数最大...

    TerryCai 评论0 收藏0
  • 第一个java后端项目总结

    摘要:项目环境用于发送请求测试项目介绍这是一个商城项目,本来想起名叫项目,发现自己并没有用。也是自己第一篇博客,记录一下自己的学习过程,希望一方面能多做写项目锻炼能力,另一方面也让自己在做完之后写写博客自己总结反思。 1.项目环境 IDEA15 spring4 mybatis3.4 mysql RestLet Client用于发送请求测试 2.项目介绍 这是一个商城项目,本来想起名叫SSM项...

    Hwg 评论0 收藏0
  • BigDecimal遇到的问题,大伙也说说

    摘要:舍入方式需要弄明白自己的业务才用,别为了用而随便选一个用四舍五入模式从零四舍五入。原值结论都是向前进一位四舍五入到正无穷。 一:相除精度丢失的问题  BigDecimal的api除法相对加减乘要实现的复杂多了,只介绍常用的我遇到的问题:   问题:两数相除,如果9/3=3整除没问题,但是10/3=0.33333333......除不尽,这里不能让电脑一直除不尽,所以BigDecimal...

    harriszh 评论0 收藏0
  • java学习(五) —— 常用API类概述

    摘要:成员方法类概述用于产生随机数成员方法正则表达式相关方法判断功能分割功能替换功能获取功能和类的使用类概述包含一些有用的类字段和方法。注意它不能被实例化,因为此类构造器是私有的成员方法类类概述表示特定的瞬间,精确到毫秒。 前言 我们都知道,JDK包含了JRE,而JRE中也提供了各种功能的java类,现在我们就对这些类有个简单了解,然后灵活运用。 常用类:Object类/Scanner类,...

    Tecode 评论0 收藏0
  • BigDecimal 学习

    摘要:然而表示这个是的锅,我不背。的表示一共的数字位能存储个,表示存储两位小数。因为默认是保留两位小数,超过了精度,所以保存近似值。大范围低精度存储。很准确,采用科学计数法,损失精度,但能存储更大范围的数据,但是精度有损失。 BigDecimal 为什么要使用这个呢?简单点说就是商业要求精度计算,而double计算出来的结果,往往出人意料。 例子 Double运算 showImg(https...

    linkFly 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<