java 保留小数位 - bigdecimal

本文详细介绍了如何使用Java中的BigDecimal类进行小数位数的精确控制,包括setScale方法的不同舍入模式及其应用场景,如ROUND_HALF_UP和ROUND_HALF_DOWN的区别。

bigdecimal 保留小数位

public class test1_format {

    public static void main(String[] args) {
        BigDecimal decimal = new BigDecimal("1.12345");
        System.out.println(decimal);
        BigDecimal setScale = decimal.setScale(4,BigDecimal.ROUND_HALF_DOWN);
        System.out.println(setScale);
        
        BigDecimal setScale1 = decimal.setScale(4,BigDecimal.ROUND_HALF_UP);
        System.out.println(setScale1);
    }
}

参数定义

ROUND_CEILING
Rounding mode to round towards positive infinity.
向正无穷方向舍入

ROUND_DOWN
Rounding mode to round towards zero.
向零方向舍入

ROUND_FLOOR
Rounding mode to round towards negative infinity.
向负无穷方向舍入

ROUND_HALF_DOWN
Rounding mode to round towards “nearest neighbor” unless both neighbors are equidistant, in which case round down.
向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,向下舍入, 例如1.55 保留一位小数结果为1.5

ROUND_HALF_EVEN
Rounding mode to round towards the “nearest neighbor” unless both neighbors are equidistant, in which case, round towards the even neighbor.
向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,如果保留位数是奇数,使用ROUND_HALF_UP ,如果是偶数,使用ROUND_HALF_DOWN

ROUND_HALF_UP
Rounding mode to round towards “nearest neighbor” unless both neighbors are equidistant, in which case round up.
向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,向上舍入, 1.55保留一位小数结果为1.6

ROUND_UNNECESSARY
Rounding mode to assert that the requested operation has an exact result, hence no rounding is necessary.
计算结果是精确的,不需要舍入模式

ROUND_UP
Rounding mode to round away from zero.
向远离0的方向舍入

Java 中使用 `BigDecimal` 类保留 2 位小数可以采用以下几种方法: ### 四舍五入模式 使用 `divide` 方法并指定保留小数位数和舍入模式为 `RoundingMode.HALF_UP`,示例代码如下: ```java import java.math.BigDecimal; import java.math.RoundingMode; public class BigDecimaDemo { public static void main(String[] args) { BigDecimal a = new BigDecimal("10.00"); BigDecimal b = new BigDecimal("3"); // 设置保留两位小数,并采用四舍五入模式 BigDecimal result = a.divide(b, 2, RoundingMode.HALF_UP); System.out.println(result); } } ``` 上述代码中,`divide` 方法的第二个参数表示保留小数位数,第三个参数 `RoundingMode.HALF_UP` 表示四舍五入模式 [^1]。 ### 不四舍五入模式 #### 方法一:使用 `DecimalFormat` 类 ```java import java.math.BigDecimal; import java.math.RoundingMode; import java.text.DecimalFormat; public class Main { public static void main(String[] args) { BigDecimal money = new BigDecimal("68686887"); DecimalFormat decimal = new DecimalFormat("#0.00"); decimal.setRoundingMode(RoundingMode.DOWN); System.out.println(decimal.format(money)); } } ``` #### 方法二:使用 `setScale` 方法 ```java import java.math.BigDecimal; public class Main { public static void main(String[] args) { BigDecimal money = new BigDecimal("68686887"); BigDecimal bigDecimal = new BigDecimal(money).setScale(2, BigDecimal.ROUND_DOWN); System.out.println(bigDecimal.toString()); } } ``` 这两种方法都能实现不四舍五入保留两位小数,`RoundingMode.DOWN` 表示直接截断小数部分 [^2]。 ### 结合 `MathContext` 类 ```java import java.math.BigDecimal; import java.math.MathContext; import java.math.RoundingMode; public class Main { public static void main(String[] args) { BigDecimal sum = new BigDecimal("100"); BigDecimal yearValue = new BigDecimal("30"); MathContext mathContext = new MathContext(2, RoundingMode.DOWN); BigDecimal result = yearValue.divide(sum, mathContext); System.out.println(result); } } ``` 这里的 `MathContext` 类用于指定精度和舍入模式,`RoundingMode.DOWN` 表示直接截断 [^4]。 ### 转化为百分比形式 ```java import java.math.BigDecimal; import java.math.RoundingMode; import java.text.NumberFormat; public class Main { public static void main(String[] args) { BigDecimal a = new BigDecimal(0.82); 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())); } } ``` 代码中先使用 `setScale` 方法保留两位小数,然后将结果转化为百分比形式 [^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值