1.情景展示
比方說,有一數字000122,進行加法運算+1后,返回000123,如何實現?
2.原因分析
我們知道,在java中,只要是數字,用代表數字類型的數據類型(byte、short、int、long、double、float、BigDecimal)一旦接收,不管數字前方有幾個0,都會被吃掉。
所以,我們要想被加數前面有0,必須用字符串來接收,也就是:
String number = “000122”,而不是int i = 000122;
要想進行加減運算,我們就必須將其轉換成基本數據類型,進行運算,此時,前面的0已經消失了,所以,我們還要進行補零操作。
3.解決方案
/*
* 加法、減法計算(整數之間的運算)
* @attention: 不支持被加數以0開頭,且被加數+加數>9223372036854775807的整數求和運算
* BigDecimal支持小數運算,該函數只支持整數之間的運算
* @date: 2020年11月11日 0011 16:28
* @param: augend 被加數(前面可以帶0)
* @param: addend 加數(可以為負數)
* @return: java.lang.String 返回字符串是因為:如果前面有0,轉數字的話,0會被吞掉
*/
public static String numberAddition(String augend, int addend) {
if (!isWholeNumber(augend)) return "被加數不是整數,無法進行加法運算";
// 以0開頭,說明進行加法運算后需要進行補零操作
if (augend.startsWith("0")) {
// 校驗是否大於long類型的最大值:9223372036854775807
long augendNum;
try {
// 因為String.format()不支持BigDecimal運算,只支持基本數據類型,所以無法調用format()直接進行補零操作
augendNum = Long.parseLong(augend);
} catch (NumberFormatException n) {
return "被加數>long類型的最大值9223372036854775807";
}
long result = augendNum + addend;
// 被加數>0,被加數>加數的絕對值,這樣result肯定應該大於0
if (augendNum > 0 && augendNum > Math.abs(addend) && result < 0) {
return "被加數以0開頭,且被加數+加數>long類型的最大值9223372036854775807";
}
// 字符串轉數字,前面的0會消失(按原來的長度進行補零)
// return String.format("%0" + augend.length() + "d", Integer.parseInt(augend) + addend);
return String.format("%0" + augend.length() + "d", Long.parseLong(augend) + addend);
}
if (!augend.startsWith("0")) {
// 被加數不以0開頭且被加數+加數>9223372036854775807
BigDecimal resultBg = new BigDecimal(augend).add(new BigDecimal(addend));
if (resultBg.compareTo(new BigDecimal(Long.MAX_VALUE)) == 1) {
return String.valueOf(resultBg);
} else {
// 正常的整數運算
return String.valueOf(Long.parseLong(augend) + addend);
}
}
// 不會執行(走不到這兒)
return "";
}
4.測試
public static void main(String[] args) {
System.out.println(numberAddition("2020111100017420201111000174", 1));
System.out.println(numberAddition("00009223372036854775806", 1));
System.out.println(numberAddition("009223372036854775807", 2));
System.out.println(numberAddition("0000134", 1));
System.out.println(numberAddition("122", 1));
}
寫在最后
哪位大佬如若發現文章存在紕漏之處或需要補充更多內容,歡迎留言!!!
相關推薦:
