BigDecimal如何保留两位小数

 更新时间:2026年04月01日 09:36:43   作者:慢慢变富的w  
本文介绍了浮点数计算的不精确性,以及在商业计算中需要使用BigDecimal来保证精确性,详细解释了BigDecimal的setScale()方法和roundingMode常量的使用方法,并提供了示例代码

前言

在项目中经常会用到小数的一些计算,而float和double类型的主要设计目标是为了科学计算和工程计算。

他们执行二进制浮点运算,这是为了在广域数值范围上提供较为精确的快速近似计算而精心设计的。

然而,它们没有提供完全精确的结果,所以不应该被用于要求精确结果的场合。

但是,商业计算往往要求结果精确。所以有时候必须要采用BigDecimal。

1.代码实现

代码如下(示例):

public class Demo {
   public static void main(String[] args) {
  		BigDecimal a =null;
  		Integer faultRate = 6;
  		a = BigDecimal.valueOf(faultRate.doubleValue()/3);
  		BigDecimal  b =a.setScale(2, RoundingMode.HALF_UP);//保留两位小数
  		System.out.println("结果是"+b);
  		//下面将结果转化成百分比
  		NumberFormat percent = NumberFormat.getPercentInstance();
       percent.setMaximumFractionDigits(2);
       System.out.println(percent.format(b.doubleValue()));
   }
}

运行结果:


2.方法详解

  • 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则向下舍
  • setScaler(1,BigDecimal.ROUND_CEILING)接近正无穷大的舍入
  • setScaler(1,BigDecimal.ROUND_FLOOR)接近负无穷大的舍入,数字>0和ROUND_UP作用一样,数字<0和ROUND_DOWN作用一样
  • setScaler(1,BigDecimal.ROUND_HALF_EVEN)向最接近的数字舍入,如果与两个相邻数字的距离相等,则向相邻的偶数舍入。

注释

1:scale指的是你小数点后的位数。

  • 比如123.456则score就是3.
  • score()就是BigDecimal类中的方法啊。
  • 比如:BigDecimal b = new BigDecimal(“123.456”);b.scale(),返回的就是3.

2:roundingMode是小数的保留模式。

  • 它们都是BigDecimal中的常量字段,有很多种。
  • 比如:BigDecimal.ROUND_HALF_UP表示的就是4舍5入。

3:pubilc BigDecimal divide(BigDecimal divisor, int scale, int roundingMode)的意思是说:

  • 我用一个BigDecimal对象除以divisor后的结果,并且要求这个结果保留有scale个小数位,
  • roundingMode表示的就是保留模式是什么,是四舍五入啊还是其它的,你可以自己选!

4:对于一般add、subtract、multiply方法的小数位

格式化如下:

  BigDecimal mData = new BigDecimal("9.655").setScale(2, BigDecimal.ROUND_HALF_UP);
  System.out.println("mData=" + mData);

运行结果:

mData=9.66

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 在win10系统下,如何配置Spring Cloud alibaba Seata以及出现问题时怎么解决

    在win10系统下,如何配置Spring Cloud alibaba Seata以及出现问题时怎么解决

    今天教大家如何在win10系统下,配置Spring Cloud alibaba Seata以及出现问题时怎么解决,文中有非常详细的介绍及代码示例,需要的朋友可以参考下
    2021-06-06
  • java常用的定时任务框架及相关代码应用示例

    java常用的定时任务框架及相关代码应用示例

    在Java开发中,定时任务是一个常见的需求,比如定时备份数据、定时清理日志、定时发送邮件等,这篇文章主要介绍了java常用的定时任务框架及相关代码应用的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2025-11-11
  • 源码解读Mybatis占位符#和$的区别

    源码解读Mybatis占位符#和$的区别

    这篇文章主要介绍了Mybatis占位符#和$的区别通过源码解读,针对笔者日常开发中对 Mybatis 占位符 #{} 和 ${} 使用时机结合源码,思考总结而来,需要的朋友可以参考下
    2023-02-02
  • 详解Java中异步转同步的六种方法

    详解Java中异步转同步的六种方法

    针对应用中异步调用,能不能像同步调用一样立刻获取到命令的执行结果,如何实现异步转同步?不要担心,本文就来为大家详细讲讲Java中异步转同步的六种方法,感兴趣的可以了解一下
    2022-06-06
  • java实现的密码强度检测功能完整示例

    java实现的密码强度检测功能完整示例

    这篇文章主要介绍了java实现的密码强度检测功能,结合完整实例形式分析了java针对密码强度检测相关的字符串遍历、判断,以及输出密码强度等级相关操作技巧,需要的朋友可以参考下
    2019-06-06
  • 在springboot中对kafka进行读写的示例代码

    在springboot中对kafka进行读写的示例代码

    本篇文章主要介绍了在springboot中对kafka进行读写的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-09-09
  • java数组输出的实例代码

    java数组输出的实例代码

    这篇文章主要介绍了java数组输出的实例代码,有需要的朋友可以参考一下
    2013-12-12
  • 导入maven项目各个注解均报错的解决方案

    导入maven项目各个注解均报错的解决方案

    这篇文章主要介绍了导入maven项目各个注解均报错的解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • Java中使用开源库JSoup解析HTML文件实例

    Java中使用开源库JSoup解析HTML文件实例

    这篇文章主要介绍了Java中使用开源库JSoup解析HTML文件实例,Jsoup是一个开源的Java库,它可以用于处理实际应用中的HTML,比如常见的HTML格式化就可以用它来实现,需要的朋友可以参考下
    2014-09-09
  • Java实现自动把报表插入到word文档中

    Java实现自动把报表插入到word文档中

    在很多业务场景中需要在 word 文档中嵌入报表,这篇文章主要为大家介绍了如何使用Java实现自动把报表插入到word文档中,需要的可以参考下
    2024-12-12

最新评论