Java开发技巧

一、BigDecimal.divide使用注意事项

      Bigdecimal类型的值进行除法运算时,需要考虑结果是否会出现无限循环小数,如果结果是无线循环小数,就会报错,比如:

    public static void main(String[] args) {

        BigDecimal b1 = new BigDecimal("10");
        BigDecimal b2 = new BigDecimal("3");

        BigDecimal result = b1.divide(new BigDecimal("3"));

        System.out.println(b1 + "/" + b2 + "=" + result);
    }

结果:

解决方法:

    public static void main(String[] args) {

        BigDecimal b1 = new BigDecimal("10");
        BigDecimal b2 = new BigDecimal("3");

        //方法1:不设置精度
        BigDecimal result1 = b1.divide(new BigDecimal("3"), BigDecimal.ROUND_HALF_UP);
        System.out.println("方法1--->" + b1 + "/" + b2 + "=" + result1);
        //方法2:设置小数点儿保留两位小数
        BigDecimal result2 = b1.divide(new BigDecimal("3"), 2, BigDecimal.ROUND_HALF_UP);
        System.out.println("方法2--->" + b1 + "/" + b2 + "=" + result2);
    }

运行结果:

补充:

roundingMode为小数模式;

             ROUND_CEILING
             如果 BigDecimal 是正的,则做 ROUND_UP 操作;如果为负,则做 ROUND_DOWN 操作。
             ROUND_DOWN
             从不在舍弃(即截断)的小数之前增加数字。
             ROUND_FLOOR
             如果 BigDecimal 为正,则作 ROUND_UP ;如果为负,则作 ROUND_DOWN 。
             ROUND_HALF_DOWN
             若舍弃部分> .5,则作 ROUND_UP;否则,作 ROUND_DOWN 。
             ROUND_HALF_EVEN
             如果舍弃部分左边的数字为奇数,则作 ROUND_HALF_UP ;如果它为偶数,则作 ROUND_HALF_DOWN 。
             ROUND_HALF_UP
             若舍弃部分>=.5,则作 ROUND_UP ;否则,作 ROUND_DOWN 。
             ROUND_UNNECESSARY
             该“伪舍入模式”实际是指明所要求的操作必须是精确的,,因此不需要舍入操作。
             ROUND_UP
             总是在非 0 舍弃小数(即截断)之前增加数字。

二、BigDecimal.setScale()注意事项

        Bigdecimal类型的值进行舍位运算时,一定要设置取舍方式,否则会报错:

package com.xj.main;

import java.math.BigDecimal;
/**
 * @Author : xjfu
 * @Date : 2022/7/27 16:54
 * @Description :
 */
public class Test {

    public static void main(String[] args) {
        BigDecimal aa = new BigDecimal("123.35689");
        //报错,若aa小数点有两位,就不会报错,但是aa小数点后面有5位,必须要设置取舍方式
        BigDecimal a1 = aa.setScale(2);
        
        System.out.println("a1-->" + a1);
    }
}

运行结果:

 解决方法:

package com.xj.main;

import java.math.BigDecimal;
/**
 * @Author : xjfu
 * @Date : 2022/7/27 16:54
 * @Description :
 */
public class Test {

    public static void main(String[] args) {
        BigDecimal aa = new BigDecimal("123.35689");
        //报错,若aa小数点有两位,就不会报错,但是aa小数点后面有5位,必须要设置取舍方式
        //BigDecimal a1 = aa.setScale(2);
        //正确做法:设置取舍方式
        BigDecimal a1 = aa.setScale(2,BigDecimal.ROUND_HALF_UP);

        System.out.println("a1-->" + a1);
    }
}

运行结果:

三、String.contains()方法注意事项

       最近使用contains()方法做判断,结果测试出一个问题,在这里做上笔记,待以后反省总结:

       String.contains()方法:该方法是判断字符串中是否有子字符串。如果有则返回true,如果没有则返回false。

       但是如果子字符串为“”,则也会返回true。

       代码举例:

        String str1 = "abcd";

        String str = "";

        if (str1.contains(str)){
            System.out.println("包含");
        }else{
            System.out.println("不包含");
        }

运行结果:

四、获取控制台输入的数据并进行升序排序

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {

        //构造一个Scanner类的对象,并且与标准输入流System.in关联
        Scanner sc = new Scanner(System.in);

        System.out.println("请输入一行数据,用空格分割:");
        //读取输入的一行数据
        String str = sc.nextLine();
        //正则匹配所有空白字符,并以空白字符分割
        String arrStr[] = str.split("\\s+");

        //定义个int类型的数组
        int arrInt[] = new int[arrStr.length];
        //将字符串数组arrStr转成int类型数组arrInt
        for(int j = 0; j < arrInt.length; j++)
            arrInt[j] = Integer.parseInt(arrStr[j]);

        //对arrInt数组进行升序排序
        for(int i = 0 ; i < arrInt.length - 1 ; i++){
            for(int j = 0; j < arrInt.length - 1; j++){
                if(arrInt[j] > arrInt[j + 1]){
                    int temp = arrInt[j+1];
                    arrInt[j + 1] = arrInt[j];
                    arrInt[j] = temp;
                }
            }
        }

        System.out.println("升序排序结果:");
        //将排序后的结果输出
        for(int a : arrInt){
            System.out.print(a + " ");
        }
    }
}

运行结果:

五、使用String.split()分割多个空格字符串

知识点:

(1) 根据给定的正则表达式(regex)的匹配来拆分此字符串:

                “\s”表示 空格,回车,换行等空白符

                 “+”号表示一个或多个的意思

                “\S” 表示全部空格

                " "只表示单个空格

(2)在Java中有一些特殊字符需要使用转义字符“\”进行转义:

        (    [     {    /    ^    -    $     ¦    }    ]    )    ?    *    +    . 

代码:


public class Test {
    public static void main(String[] args) {

        //字符之间以任意多个空格进行间隔
        String str = "2023-2-7    10:11 我 今天 真    的 感觉 很烦 、 很焦虑    !";

        /**
         * 正则表达式:
         *          (1)'\s+' 匹配任意多个空格字符
         *          (2)出现字符‘\’需要使用转义字符\进行转转义
         *          综上: 匹配任意多个空格就为:"\\s+"
         */
        String[] strArr = str.split("\\s+");

        //将字符串数组数据全部输出
        String result = "";
        for(String s: strArr){
            result+=s;
        }
        System.out.println("以空格分割字符串的结果为:" + "\n" + result);
    }
}

运行结果:

参考:

java分割字符串split(“\\s+“) 和 split(“+“)和的用法_哈喽哇德的博客-CSDN博客 

java split()使用“.” “\” "|" "*" "+"来分割时,需要转义_春卷同学的博客-CSDN博客_"split(\"\\\\*\")"

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值