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类型的值进行舍位运算时,一定要设置取舍方式,否则会报错:
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);
}
}
运行结果:
最近使用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 + " ");
}
}
}
运行结果:
知识点:
(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(\"\\\\*\")"