转载请注明出处:目录1.BigDecimal 简介2.构造BigDecimal的对象3.常用方法总结4.divide方法使用5.setScale 方法使用6.BigDecimal 数据库存储类型对应 decimal1.BigDecimal 简介在进行浮点数 long 或 double 类型的运算时,如果直接进行运算 , 浮点数的运算会出现精度失准的情况,特别是在计算和金额相关的运算时,必须计算精确,不能出现误差 , BigDecimal 的出现就是为了解决 浮点数类型的运算精度失准的场景;
示例:
public static void main(String[] args) {System.out.println(0.2+0.1);System.out.println(0.3-0.1);System.out.println(0.2*0.1);System.out.println(0.3/0.1);}运行后的结果如下:
文章插图
2.构造BigDecimal的对象BigDecimal提供了丰富的构造函数,可以通过int、long、double、String等来构造一个BigDecimal对象 。
但是,使用double作为参数的构造函数,无法精确构造一个BigDecimal对象,需要自己指定一个上下文的环境,也就是指定精确位 。
BigDecimal bg = new BigDecimal(1.1);System.out.println(bg.toString());运行结果:1.100000000000000088817841970012523233890533447265625所以,通常情况下 , 我们会使用String对象作为参数来构造一个精确的BigDecimal对象 。下面提供的三种方法都是可以的:
【BigDecimal 用法总结】//方法一BigDecimal bg1 = new BigDecimal("1.1");//方法二BigDecimal bg2 = new BigDecimal(Double.toString(1.1));//方法三BigDecimal bg3 = BigDecimal.valueOf(1.1);System.out.println(bg1.toString());System.out.println(bg2.toString());System.out.println(bg3.toString());运行结果:1.11.11.13.常用方法总结
- add(BigDecimal): BigDecimal对象中的值相加 , 返回BigDecimal对象
- subtract(BigDecimal): BigDecimal对象中的值相减 , 返回BigDecimal对象
- multiply(BigDecimal): BigDecimal对象中的值相乘,返回BigDecimal对象
- divide(BigDecimal): BigDecimal对象中的值相除,返回BigDecimal对象
- toString(): 将BigDecimal对象中的值转换成字符串
- doubleValue(): 将BigDecimal对象中的值转换成双精度数
- floatValue(): 将BigDecimal对象中的值转换成单精度数
- longValue(): 将BigDecimal对象中的值转换成长整数
- intValue(): 将BigDecimal对象中的值转换成整数
- a.max (b) 比较取最大值
- a.min(b) 比较取最小值
- a.abs() 取最绝对值
- negate(): 取相反数
- (BigDecimal).compareTo(BigDecimal2) : 比较两个BigDecimal 对象的大?。?返回值为-1,表示bigdemical小于bigdemical2; 返回值为 0,表示bigdemical等于bigdemical2; a = 1,表示bigdemical大于bigdemical2;
public BigDecimal divide(BigDecimal divisor,int scale, int roundingMode)第一个参数是除数,第二个参数代表保留几位小数,第三个代表的是使用的模式 。第三个参数可以使用如下常量配置:
BigDecimal.ROUND_DOWN:直接省略多余的小数,比如1.28如果保留1位小数,得到的就是1.2BigDecimal.ROUND_UP:直接进位,比如1.21如果保留1位小数,得到的就是1.3BigDecimal.ROUND_HALF_UP:四舍五入,2.35保留1位,变成2.4BigDecimal.ROUND_HALF_DOWN:四舍五入 , 2.35保留1位,变成2.3后边两种的区别就是如果保留的位数的后一位如果正好是5的时候,一个舍弃掉,一个进位 。进行除法运算,并四舍五入
System.out.println(new BigDecimal("2322").divide(new BigDecimal("209.123345456667"),2, BigDecimal.ROUND_HALF_UP));执行结果为 :11.10
5.setScale 方法使用setScale(1)表示保留一位小数,默认用四舍五入方式
setScale(1)表示保留一位小数,默认用四舍五入方式setScale(1,BigDecimal.ROUND_DOWN)直接删除多余的小数位,如2.35会变成2.3setScale(1,BigDecimal.ROUND_UP)进位处理,2.35变成2.4setScale(1,BigDecimal.ROUND_HALF_UP)四舍五入,2.35变成2.4setScaler(1,BigDecimal.ROUND_HALF_DOWN)四舍五入,2.35变成2.3,如果是5则向下舍示例:
double dou = 3.14789;//BigDecimal.ROUND_UP 四舍五入//BigDecimal.ROUND_DOWN 直接舍弃保留位数之后小数BigDecimal bigDecimal = new BigDecimal(dou).setScale(2, BigDecimal.ROUND_DOWN);double newDouble = bigDecimal.doubleValue();System.out.println("newDouble:" + newDouble);注: 1、BigDecimal.ROUND_UP 四舍五入 , BigDecimal.ROUND_DOWN 直接舍弃保留位数之后小数; 2、位数不够时,不会补齐
推荐阅读
- .Net Framework中的AppDomain.AssemblyResolve事件的常见用法、问题,以及解决办法
- 【博学谷学习记录】超强总结,用心分享|MySql连接查询超详细总结
- 无悔华夏政略机制用法是什么
- C语言下for循环的一点技巧总结
- 2022.9.30 Java第四次课后总结
- vue3中pinia的使用总结
- LeetCode - 数组的旋转总结
- NLTK/spaCy 自然语言处理NLP程序包使用总结
- Makfile总结
- DophineSheduler上下游任务之间动态传参案例及易错点总结