java 除法運算只保留整數位的4種方式


1.情景展示

  根據提供的毫秒數進行除法運算,如果將毫秒數轉換成小時,小時數不為0,則只取整數位,依此類推...

2.情況分析

  可以使用3個函數實現

  Math.floor(num)   只保留整數位

  Math.rint(num)     余數四舍五入

  Math.ceil(num)     取整位,再+1

  舉例:

double num = 3.1415926;
System.out.println(Math.floor(num));// 3.0
System.out.println(Math.rint(num));// 3.0
System.out.println(Math.ceil(num));// 4.0

  網上取整的例子到這就結束啦,都說了只取整數位,返回的是一個double類型的數字,所以,還需要強轉成整數。

  這次是正確答案!

double num = 3.1415926;
System.out.println((int)Math.floor(num));// 3
System.out.println((int)Math.rint(num));// 3
System.out.println((int)Math.ceil(num));// 4  

  2019/05/23 補充:

  Java整數之間的除法運算,默認只返回整數位,也就相當於Math.floor()函數了。

  方式四:

double num = 3.1415926;
// 直接使用int進行強制轉換
System.out.println((int)num);//3
num = 3.789;
System.out.println((int)num);//3
// 整數運算,默認將運算結果強制轉換成了整數(只保留整數位)
int i4 = 1/10;
System.out.println(i4);//0

 

3.解決方案

// 還差多長時間執行,單位:毫秒數
long exeTime = 1234567;
// 時間單位
String timeUnit = "";
// 首次執行剩余時間
int remaTime = 0;

if (Math.floor(exeTime/1000/3600) > 0) {
	remaTime = (int)Math.floor(exeTime/1000/3600);
	timeUnit = "小時";
} else if (Math.floor(exeTime/1000/60) > 0) {
	remaTime = (int)Math.floor(exeTime/1000/60);
	timeUnit = "分鍾";
} else {
	remaTime = (int)Math.floor(exeTime/1000);
	timeUnit = "秒";
}

System.out.println("啟動定時器...SbptAction...距離任務執行還有" + remaTime + timeUnit + "!"); 

4.問題擴展

  這樣寫,有一個問題,如果你的項目使用了SonarLint代碼檢測工具,原生的代碼檢測會報錯。 

  意思是說:這樣的算法很簡單,根本不需要調用取整函數,就能知道結果。屬於嚴重錯誤級別。

  如何規避這個錯誤檢測規則?

double hours = exeTime/1000/3600;
double minutes = exeTime/1000/60;
double seconds = exeTime/1000;

if (Math.floor(hours) > 0) {
	remaTime = (int)Math.floor(hours);
	timeUnit = "小時";
} else if (Math.floor(minutes) > 0) {
	remaTime = (int)Math.floor(minutes);
	timeUnit = "分鍾";
} else {
	remaTime = (int)Math.floor(seconds); 
	timeUnit = "秒";
}

  使用上述代碼進行替換,就不會報嚴重錯誤了!

5.最佳解決方案

  當我知道Java整數之間的除法運算,默認只返回整數位時,才恍然大悟,上面的校驗規則報錯的原因:

  因為運算結果本身返回只有整數位,雖然結果用double接收的,但其本質仍然是個整數,

  所以,就沒有必要調用Math.floor()來只取整數位了,直接強制轉換成int就可以了!

// Java整數間的除法運算,默認只保留整數位
double hours = exeTime/1000/3600;
double minutes = exeTime/1000/60;
double seconds = exeTime/1000;

// hours,minutes,seconds的結果只可能為0.0/1.0/2.0等(即小數位永遠為0),不可能為:0.1/1.1/2.1 if (hours > 0) { remaTime = (int)hours; timeUnit = "小時"; } else if (minutes > 0) { remaTime = (int)minutes; timeUnit = "分鍾"; } else { remaTime = (int)seconds; timeUnit = "秒"; }

 

寫在最后

  哪位大佬如若發現文章存在紕漏之處或需要補充更多內容,歡迎留言!!!

 相關推薦:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM