自定义截取小数点后的数据

文章介绍了两种处理小数点后位数的方法,包括Java中使用自定义方法和BigDecimal的setScale方法,以及MySQL中的ROUND函数。推荐使用BigDecimal进行高精度计算,提供了多种舍入模式,如HALF_UP进行四舍五入。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

日常需求中,会有截取小数点后的数据。以下总结了两种方法:(推荐方法二,你懂的

一、方法一:

该方法可以自定义保留小数点后N位,如果数值不满足自定义的位数,则用0补位。

    /**
     * @param str 需要截取的数字
     * @param num 需要保留小数点后的位数
     */
    public String cut(String str, int num) {
        // 判断是整数还是小数,如果是整数,则小数点后用0补位
        if (!str.contains(".")) {
            String b = ".";
            for (int a = 0; a < num; a++) {
                b = b + "0";
            }
            return str + b;
        }

        // 获取小数点的位置
        int index = str.indexOf(".");
        String beforeNum = str.substring(0, index + 1);
        // 获取小数点后面是否有num位,不足用0补位
        String afterNum = str.replace(beforeNum, "");
        // 判断小数点后位数是否大于保留的位数
        if (afterNum.length() <= num) {
            for (int a = afterNum.length(); a < num; a++) {
                afterNum = afterNum + "0";
            }
        } else {
            afterNum = afterNum.substring(0, num);
        }
        return beforeNum + afterNum;
    }

结果: 

二、方法二:(强烈推荐)

对精度要求较高的业务,推荐使用该方法。BigDecimal提供setScalefa(a,b)方法。

setScalefa(a,b)方法是用来设置BigDecimal对象的精度和舍入模式的。这个方法有两个参数,第一个参数是精度,即小数点后保留的位数;第二个参数是舍入模式,用来指定舍入规则。

BigDecimal的舍入模式:

  • UP(BigDecimal.ROUND_UP):远离零方向舍入。向远离0的方向舍入,也就是说,向绝对值最大的方向舍入,只要舍弃位非0即进位
  • DOWN(BigDecimal.ROUND_DOWN):趋向0方向舍入。向0方向靠拢,也就是说,向绝对值最小的方向输入,注意:所有的位都舍弃,不存在进位情况
  • CEILING(BigDecimal.ROUND_CEILING):向正无穷方向舍入。向正最大方向靠拢,如果是正数,舍入行为类似于ROUND_UP;如果为负数,则舍入行为类似于ROUND_DOWN.注意:Math.round方法使用的即为此模式
  • FLOOR(BigDecimal.ROUND_FLOOR):向负无穷方向舍入。向负无穷方向靠拢,如果是正数,则舍入行为类似ROUND_DOWN,如果是负数,舍入行为类似以ROUND_UP
  • HALF_UP(BigDecimal.ROUND_HALF_UP):最近数字舍入(5舍),这就是我们经典的四舍五入
  • HALF_DOWN(BigDecimal.ROUND_HALF_DOWN):最近数字舍入(5舍)。在四舍五入中,5是进位的,在HALF_DOWN中却是舍弃不进位
  • HALF_EVEN(BigDecimal.ROUND_HALF_EVEN):银行家算法。四舍六入五考虑,五后非零就进一,五后为零看奇偶,五前为偶应舍去,五前为奇要进一。见最后详解
  • UNNECESSARY(BigDecimal.ROUND_UNNECESSARY):断言请求的操作具有精确的结果,因此不需要舍入。如果对获得精确结果的操作指定此舍入模式,则抛出ArithmeticException
    /**
     * @param str 需要截取的数字
     * @param num 需要保留小数点后的位数
     */
    public BigDecimal cut(String str, int num) {
        BigDecimal bd = new BigDecimal(str);
        // 保留num位小数(四舍五入)
        bd = bd.setScale(num, RoundingMode.HALF_UP);
        return bd;
    }

结果:

三、方法三(MySQL:ROUND( X , D)函数

表结构:

 SQL语句:

SELECT
	ROUND( salary, 2 ) 
FROM
	salary

ROUND(X,D) 返回最接近于参数 X 的整数;ROUND( X , D) 函数对参数 X 进行四舍五入的操作,返回值保留小数点后面指定的 D 位。

D 默认是 0 ,即 ROUND( X )等同于 ROUND(  , D) 。D 也可是负数,指定小数点左边的d位整数位为 0, 同时小数位均为 0。

结果:

如果这篇文章对您有所帮助,或者有所启发的话,求一键三连:点赞、评论、收藏➕关注,您的支持是我坚持写作最大的动力。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Javaの甘乃迪

感谢看客老爷的打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值