BigDecimal只覆盖整数部分或小数部分

   有个特殊处理需要把BigDecimal的整数部分和小数部分分开计算

public class BdTest {
    public static void main(String[] args) {
        BdBean bt = new BdBean();
        bt.setBdA(4);
        System.out.println(bt.getB());
        bt.setBdA(0);
        System.out.println(bt.getB());
        bt.setBdB(4);
        System.out.println(bt.getB());
        bt.setBdB(0);
        System.out.println(bt.getB());
    }
}
//
class BdBean {
    @Getter
    @Setter
    private BigDecimal b = new BigDecimal("23.25");
    //获取整数部分
    public int getBdA() {
        return b.intValue();
    }

    //覆盖整数部分
    public void setBdA(int value) {
        setB(BigDecimal.valueOf(value).add(getB().divideAndRemainder(BigDecimal.ONE)[1]));
    }

    //获取小数部分
    public int getBdB() {
        // return b.movePointRight(2).remainder(BigDecimal.valueOf(Math.pow(10, 2))).intValue();
        return b.movePointRight(2).remainder(new BigDecimal("100")).intValue();
    }
    //覆盖小数部分
    public void setBdB(int value) {
        if (value == 0) {
            setB(getB().setScale(0, RoundingMode.DOWN));
            return;
        }
        int len = (int) Math.log10(value) + 1;
        long val = (long) (b.longValue() * Math.pow(10, len) + value);
        setB(BigDecimal.valueOf(val, len));
    }
}

  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 可以使用`BigDecimal`的`remainder`方法来获取小数部分。例如,假设有一个`BigDecimal`对象`bd`,要获取其小数部分,可以使用以下代码: ``` BigDecimal fractionalPart = bd.remainder(BigDecimal.ONE); ``` 这里的`BigDecimal.ONE`表示1,也就是整数部分。`remainder`方法返回的是除以指定参数后的余数,因此这里返回的就是小数部分。注意,返回值也是`BigDecimal`类型。 ### 回答2: BigDecimalJava中用于精确计算的类,它可以表示任意精度的浮点数。要取BigDecimal对象中的小数部分,可以使用stripTrailingZeros()方法和setScale()方法。 stripTrailingZeros()方法用于删除BigDecimal对象末尾多余的零。例如,对于BigDecimal对象1.23000,使用stripTrailingZeros()方法后会得到1.23。 setScale()方法用于设置BigDecimal对象的小数位数。可以通过setScale(0, RoundingMode.FLOOR)来将BigDecimal对象的小数部分截断为零位。例如,对于BigDecimal对象1.23,使用setScale(0, RoundingMode.FLOOR)方法后会得到1。 可以将这两个方法结合使用,先使用stripTrailingZeros()方法删除BigDecimal对象末尾的多余零,再使用setScale(0, RoundingMode.FLOOR)方法将小数部分截断为零位。以下是一个示例代码: ```java import java.math.BigDecimal; import java.math.RoundingMode; public class BigDecimalExample { public static void main(String[] args) { BigDecimal number = new BigDecimal("1.23000"); BigDecimal scaledNumber = number.stripTrailingZeros().setScale(0, RoundingMode.FLOOR); System.out.println("原始数字:" + number); System.out.println("小数部分:" + number.subtract(scaledNumber)); } } ``` 以上代码中,首先创建一个BigDecimal对象number,它的值为1.23000。然后使用stripTrailingZeros()方法和setScale(0, RoundingMode.FLOOR)方法取得BigDecimal对象number的小数部分。最后打印出小数部分。 运行以上代码,输出结果为: ``` 原始数字:1.23000 小数部分:0.23 ``` 以上就是使用BigDecimal进行小数部分提取的方法。 ### 回答3: BigDecimal类中有两种方法可以取得小数部分:setScale()方法和stripTrailingZeros()方法。 1. setScale()方法:这个方法可以设置精度(小数点后几位)并且同时进行四舍五入操作。可以通过以下步骤来取得BigDecimal对象的小数部分: - 使用setScale()方法设置精度,传入参数为0和BigDecimal.ROUND_DOWN,表示将小数点后的位数设为0,并且舍弃多余的位数。 - 使用subtract()方法,传入整数部分BigDecimal对象,从原始的BigDecimal对象中减去整数部分,得到的结果就是小数部分。 2. stripTrailingZeros()方法:这个方法可以去掉小数部分末尾的0。可以通过以下步骤来取得BigDecimal对象的小数部分: - 使用stripTrailingZeros()方法,得到一个新的BigDecimal对象,这个对象已经去掉了小数部分末尾的0。 - 使用subtract()方法,传入取得的BigDecimal对象和原始的BigDecimal对象相减,得到的结果就是小数部分。 需要注意的是,BigDecimal小数部分是指小数点后的部分,如果原始的BigDecimal对象是整数,将无法取得小数部分。另外,setScale()和stripTrailingZeros()方法都返回一个新的BigDecimal对象,原始的BigDecimal对象不会被修改。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值