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

不管现实多么惨不忍睹,都要持之以恒地相信,这只是黎明前短暂的黑暗而已。不要惶恐眼前的难关迈不过去,不要担心此刻的付出没有回报,别再花时间等待天降好运。真诚做人,努力做事!你想要的,岁月都会给你。自定义截取小数点后的数据,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com,来源:原文

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

一、方法一:

该方法可以自定义保留小数点后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。

结果:
自定义截取小数点后的数据

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/161440.html

(0)
飞熊的头像飞熊bm

相关推荐

发表回复

登录后才能评论
极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!