工作日记2017.09.29 BigDecimal的8种舍入模式

本文详细介绍了 Java 中 BigDecimal 类的八种舍入模式,包括 ROUND_UP、ROUND_DOWN、ROUND_CEILING 等,并提供了每种模式的含义及应用实例。此外还介绍了四种在 Java 中保留小数位数的方法。

1、ROUND_UP //舍入远离零的舍入模式。
  在丢弃非零部分之前始终增加数字(始终对非零舍弃部分前面的数字加1)。
  注意,此舍入模式始终不会减少计算值的大小。比如,1.002,保留一位小数,结果是1.1
2、ROUND_DOWN //接近零的舍入模式。
  在丢弃某部分之前始终不增加数字(从不对舍弃部分前面的数字加1,即截短)。
  注意,此舍入模式始终不会增加计算值的大小。
3、ROUND_CEILING //接近正无穷大的舍入模式。
  如果 BigDecimal 为正,则舍入行为与 ROUND_UP 相同;
  如果为负,则舍入行为与 ROUND_DOWN 相同。
  注意,此舍入模式始终不会减少计算值。
4、ROUND_FLOOR //接近负无穷大的舍入模式。
  如果 BigDecimal 为正,则舍入行为与 ROUND_DOWN 相同;
  如果为负,则舍入行为与 ROUND_UP 相同。
  注意,此舍入模式始终不会增加计算值。
5、ROUND_HALF_UP
  向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则为向上舍入的舍入模式。
  如果舍弃部分 >= 0.5,则舍入行为与 ROUND_UP 相同;否则舍入行为与 ROUND_DOWN 相同。
  注意,这是我们大多数人在小学时就学过的舍入模式(四舍五入)。
6、ROUND_HALF_DOWN
  向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则为上舍入的舍入模式。
  如果舍弃部分 > 0.5,则舍入行为与 ROUND_UP 相同;否则舍入行为与 ROUND_DOWN 相同(五舍六入)。
7、ROUND_HALF_EVEN
  向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则向相邻的偶数舍入。
  如果舍弃部分左边的数字为奇数,则舍入行为与 ROUND_HALF_UP 相同;
  如果为偶数,则舍入行为与 ROUND_HALF_DOWN 相同。
  注意,在重复进行一系列计算时,此舍入模式可以将累加错误减到最小。
  此舍入模式也称为“银行家舍入法”,主要在美国使用。四舍六入,五分两种情况
  如果前一位为奇数,则入位,否则舍去。
  以下例子为保留小数点1位,那么这种舍入方式下的结果。
  1.15>1.2 1.25>1.2
8、ROUND_UNNECESSARY
  断言请求的操作具有精确的结果,因此不需要舍入。

public static void main(String[] args) {
        System.out.println("12.5的四舍五入值:" + Math.round(12.5));
        System.out.println("-12.5的四舍五入值:" + Math.round(-12.5));
    }
Output:
12.5的四舍五入值:13
-12.5的四舍五入值:-12

四种保留小数位的方法:

方法一:四舍五入

double f = 111231.5585;
BigDecimal b = new BigDecimal(f);
double f1 = b.setScale(2, RoundingMode.HALF_UP).doubleValue();

在这里使用BigDecimal ,并且采用setScale方法来设置精确度,同时使用RoundingMode.HALF_UP表示使用最近数字舍入法则来近似计算。在这里我们可以看出BigDecimal和四舍五入是绝妙的搭配。

方式二:

java.text.DecimalFormat df =new   java.text.DecimalFormat(”#.00″);
df.format(你要格式化的数字);
   例:new java.text.DecimalFormat(”#.00″).format(3.1415926)

      #.00 表示两位小数 #.0000四位小数 以此类推…

方式三:

double d = 3.1415926;

String result = String .format(”%.2f”);

%.2f %. 表示 小数点前任意位数   2 表示两位小数 格式后的结果为f 表示浮点型。

方式四:

    此外如果使用struts标签做输出的话,有个format属性,设置为format="0.00"就是保留两位小数

      例如:
<bean:write name="entity" property="dkhAFSumPl"  format="0.00" />

或者

<fmt:formatNumber type="number" value="${10000.22/100}" maxFractionDigits="0"/>

maxFractionDigits表示保留的位数
在使用 Java 的 `BigDecimal` 类进行乘法运算时,如果希望避免在结果中自动进行四舍五入,可以通过适当设置 `BigDecimal` 对象的精度和舍入模式来实现。`BigDecimal` 的 `multiply` 方法本身不会自动进行四舍五入,但如果操作数的乘积导致小数部分超出预期精度,最终结果可能会因后续处理(例如使用 `setScale`)而产生四舍五入。因此,关键在于如何控制结果的小数位数和精度。 为了确保乘法运算后不进行四舍五入,可以使用 `MathContext` 来指定精度和舍入模式。通过将舍入模式设置为 `RoundingMode.DOWN`,可以确保即使结果超出指定精度,也不会进行四舍五入,而是直接截断多余的小数位。 以下是一个示例代码,演示如何在乘法运算中避免四舍五入: ```java import java.math.BigDecimal; import java.math.MathContext; import java.math.RoundingMode; public class BigDecimalNoRounding { public static void main(String[] args) { BigDecimal bd1 = new BigDecimal("10.75"); BigDecimal bd2 = new BigDecimal("2.50"); // 使用 MathContext 避免四舍五入 MathContext mc = new MathContext(10, RoundingMode.DOWN); // 精度为10,不进行四舍五入 // 执行乘法,不进行四舍五入 BigDecimal result = bd1.multiply(bd2, mc); System.out.println("乘法结果: " + result); } } ``` ### 代码解析 - `MathContext` 用于定义运算的精度和舍入模式。通过指定 `RoundingMode.DOWN`,可以确保在计算过程中不会进行四舍五入[^1]。 - `bd1.multiply(bd2, mc)` 方法会使用指定的 `MathContext` 进行乘法运算,结果将直接截断多余的小数位,而不会进行四舍五入。 ### 相关问题 1. 如何在 Java 中使用 `BigDecimal` 进行除法运算并避免四舍五入? 2. `BigDecimal` 的 `setScale` 方法与 `RoundingMode` 有哪些常用模式? 3. `MathContext` 在 `BigDecimal` 运算中的作用是什么? 4. 如何在 Java 中处理高精度计算时避免精度丢失? 5. `BigDecimal` 和 `double` 在精度处理上的区别是什么?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值