Java工具類——數學相關的類

来源:https://www.cnblogs.com/yychuyu/archive/2020/07/01/13221290.html
-Advertisement-
Play Games

Java工具類——數學相關的類 在上一篇文章中,我們系統學習了 Java 裡面的包裝類,那麼這篇文章,我們就來學習一下Java提供好的類——數學相關的類。 一、數學類介紹 在最早期學習 Java 基礎語法結構的時候,其實我們學習並瞭解了加減乘除這些算數運算符,有了這些運算符,我們就可以做一些簡單的運 ...


Java工具類——數學相關的類

在上一篇文章中,我們系統學習了 Java 裡面的包裝類,那麼這篇文章,我們就來學習一下Java提供好的類——數學相關的類。

一、數學類介紹

在最早期學習 Java 基礎語法結構的時候,其實我們學習並瞭解了加減乘除這些算數運算符,有了這些運算符,我們就可以做一些簡單的運算了,但是當我們需要做一些比較複雜的運算的時候,其實用這些運算符是很難去處理的(比如獲取隨機數等等)。其實數學類對於我們並不陌生,在學習 Java 基礎的時候,你一定用過 Math 類的,這個其實就是我們最早期接觸的一個數學類了,其實與數學相關的類還有 BigInteger 類、BigDecimal 類等等,下麵這個表格將這三個類做了一個小的梳理總結:

數學類 所屬包 繼承關係
Math類 java.lang包,不需要導包 預設繼承Object基類
BigInteger類 java.math包,需要導包 繼承自Number類,實現了Serializable, Comparable介面
BigDecimal類 java.math包,需要導包 繼承自Number類,實現了Serializable, Comparable介面

下麵我們就對這三種類做一個詳細的學習。

二、Math類

其實看源碼我們看到,Math 這個類是 final 修飾的,意思就是不能讓子類去繼承的,只能使用這個類。

public final class Math {}

下麵,我們來詳細瞭解一下Math類

1、Math類構造方法

通過看源碼,我們可以得知 Math 這個類的構造方法是私有的,也就是我們是不能創建對象的,為什麼會這樣設計呢,其實是因為 Math 類裡面的屬性和方法都是靜態的( static 修飾)。

/**
 * Don't let anyone instantiate this class.
 */
private Math() {}

2、Math類常用的方法

  • abs()方法返回給定數的絕對值,方法提供了4個不同參數類型重載方法(int, long, float, double)
int abs1 = Math.abs(-1);
long abs2 = Math.abs(-3l);
float abs3 = Math.abs(-1.2f);
double abs4 = Math.abs(-3.923);
System.out.println(abs1);
System.out.println(abs2);
System.out.println(abs3);
System.out.println(abs4);
  • ceil()方法返回大於或等於參數且等於一個數學整數的最小的雙精度值,可以理解為向上取整。
System.out.println(Math.ceil(-1.3));//-1.0
System.out.println(Math.ceil(1.9));//2.0
System.out.println(Math.ceil(-7.9));//-7.0
System.out.println(Math.ceil(123));//123.0
  • floor()方法返回最大的雙精度值,該雙精度值小於或等於參數,並且等於一個數學整數,可以理解為向下取整。
System.out.println(Math.floor(-1.3));//-2.0
System.out.println(Math.floor(1.9));//1.0
System.out.println(Math.floor(1.3));//1.0
System.out.println(Math.floor(-7.9));//-8.0
System.out.println(Math.floor(123));//123.0
  • round()方法返回與參數最接近的整型數,四捨五入為正無窮,其實就是四捨五入的整數。
System.out.println(Math.round(-1.3));//-1
System.out.println(Math.round(1.9));//2
System.out.println(Math.round(1.3));//1
System.out.println(Math.round(-7.9));//-8
System.out.println(Math.round(123));//123
  • max()方法返回最大值,該方法提供了4個不同參數類型重載方法(int,long,float,double)
System.out.println(Math.max(1, 3));//3
System.out.println(Math.max(-4, -5));//-4
System.out.println(Math.max(1.8, 1.92));//1.92
System.out.println(Math.max(-4f, -4f));//-4.0
  • min(a, b)方法返回最小值,該方法提供了4個不同參數類型重載方法(int, long, float, double)
System.out.println(Math.min(1, 3));//1
System.out.println(Math.min(-4, -5));//-5
System.out.println(Math.min(1.8, 1.92));//1.8
System.out.println(Math.min(-4f, -4f));//-4.0
  • pow(a, b)方法返回 a 的 b 次方,其中參數和返回值都是 double 類型的
System.out.println(Math.pow(3, 3));//27.0
System.out.println(Math.pow(3.2, 5));//335.5443200000001
  • random()方法生成一個 double 類型的隨機數,範圍是[ 0.0, 1.0),註意是左閉右開。
System.out.println(Math.random());//0.4128879706448445
System.out.println(Math.random());//0.9024029619163387
System.out.println(Math.random());//0.4265563513755902

三、BigInteger類

我們都知道,在基本數據類型裡面,long型的取值範圍是最大的,也就是8個位元組,取值範圍是-2的63次方到正的2的63次方減去1,當然,這個取值範圍很大很大,在平時的開發中,我們其中只用到int類型的都基本夠了,但是當我們存儲的數據的長度超過了 long 型的長度時,我們該怎麼存儲呢?這時候,BigInteger 類就可以解決我們的問題。

BigInteger 顧名思義,其實就是叫大整數,也就是說只能存儲整型的數,我們通過構造方法和常用方法來瞭解BigInteger 類。

1、構造方法

BigInteger 類有8個構造方法,其中有2個私有構造方法。8個構造方法分別是:

private BigInteger(int[] val){}
private BigInteger(int signum, int[] magnitude){}
public BigInteger(byte[] val){}
public BigInteger(String val){}
public BigInteger(String val, int radix) {}
public BigInteger(int signum, byte[] magnitude){}
public BigInteger(int numBits, Random rnd){}
public BigInteger(int bitLength, int certainty, Random rnd){}

2、類中常用的方法

當我們想用這個類做四則運算的時候,是不是也可以直接加減乘除呢,比如下麵這張圖:

通過上面這張圖,BigInteger類直接做四則運算顯然是不可以的,因為上面兩個數是引用類型,而運算符只能對基本數據類型做運算。那麼我們怎麼做相應的四則運算呢?其實BigInteger類裡面其實已經幫我們實現對應的方法,我們直接用實例化的的對象調用它就行了。比如下方的代碼進行加減乘除:

 private static void test6() {
    BigInteger num1 = new BigInteger("1111");
    BigInteger num2 = new BigInteger("2222");
    //加法
    BigInteger add = num1.add(num2);
    //減法
    BigInteger subtract = num2.subtract(num1);
    //乘法
    final BigInteger multiply = num1.multiply(num2);
    //除法(取整)
    BigInteger divide = num2.divide(num1);
    //除法(取餘)
    BigInteger mod = num2.mod(num1);
    System.out.println(add);//3333
    System.out.println(subtract);//1111
    System.out.println(multiply);//2468642
    System.out.println(divide);//2
    System.out.println(mod);//0
  }

四、BigDecimal類

與 BigInteger 類對應的是 BigDecimal 類,BigInteger 是處理整數的,而 BigDecimal 是處理小數的,Decimal 英文單詞就是小數的意思,所以 BigDecimal 顧名思義就是大小數,處理大的小數的。如果一個小數超過了 double類型的取值範圍,就需要用到 BigDecimal。

1、構造方法

BigDecimal 類的構造方法有很多,最常用的是以下四個:

public BigDecimal(double val) {
public BigDecimal(int val) {}
public BigDecimal(String val) {}
public BigDecimal(long val) {}

2、類中常用的方法

和 BigInteger 類一樣,BigDecimal 也是不可以直接進行加減乘除的,加減乘除的方式和 BigInteger 處理方式一樣,比如下麵的代碼對BigDecimal 進行四則運算:

private static void test7() {
  BigDecimal num1 = new BigDecimal("1.23");
  BigDecimal num2 = new BigDecimal("2.46");
  //加法
  BigDecimal add = num1.add(num2);
  //減法
  BigDecimal subtract = num2.subtract(num1);
  //乘法
  final BigDecimal multiply = num1.multiply(num2);
  //除法(取整)
  BigDecimal divide = num2.divide(num1);

  System.out.println(add);//3.69
  System.out.println(subtract);//1.23
  System.out.println(multiply);//3.0258
  System.out.println(divide);//2
}

由於小數和整數不一樣,小數經常涉及到精度的問題,所以 BigDecimal 裡面也提供了方法來設置小數的精度,設置精度的方法有三個重載的方法:

public BigDecimal setScale(int newScale)
public BigDecimal setScale(int newScale, int roundingMode)
public BigDecimal setScale(int newScale, RoundingMode roundingMode)

這三個方法的第一個參數是設置保留小數點之後的位數,第二個參數是設置的模式(比如向上取整還是向下取整等等),設置四捨五入的模式有8種:


	public final static int ROUND_UP =           0;
	
	public final static int ROUND_DOWN =         1;
	
	public final static int ROUND_CEILING =      2;
	
 	public final static int ROUND_FLOOR =        3;
 
    public final static int ROUND_HALF_UP =      4;
   
    public final static int ROUND_HALF_DOWN =    5;
  
    public final static int ROUND_HALF_EVEN =    6;
    
    public final static int ROUND_UNNECESSARY =  7;

下麵我們就來對這其中4種模式的用法做一個詳細的分析

  • ROUND_UP 模式

UP的意思就是向上的意思,可以理解為加的意思。比如我保留了三位小數,那麼我不管你後面的小數值如何(除了0),我都給你加一,就相當於四捨五入的五入。比如下麵這個代碼,我保留3為小數,模式設置為ROUND_UP模式,那麼如果最後一位是0,那麼結果就是9.461,否則就是9.462

BigDecimal bigDecimal = new BigDecimal("9.4610");
BigDecimal result = bigDecimal.setScale(3, BigDecimal.ROUND_UP);
  • ROUND_DOWN 模式

是一個舍位取值的概念,比如我保留了三位小數,那麼我不管你後面的小數值如何,也不會四捨五入,就硬生生的的截斷,相當於什麼呢,就是我從小數點後面開始取三位,三位後面的都不要了。比如下麵這個代碼,我保留3為小數,模式設置為ROUND_DOWN模式,那麼最後一位不管是什麼(從0到9),最後的結果都是9.461

BigDecimal bigDecimal = new BigDecimal("9.4611");
BigDecimal result = bigDecimal.setScale(3, BigDecimal.ROUND_DOWN);
  • ROUND_CEILING 模式

這個模式就是給定的數如果為正數,行為和ROUND_UP一樣,如果為負數,行為和ROUND_DOWN一樣 。

  • ROUND_FLOOR 模式

這個模式就是給定的數如果為正數,行為和ROUND_DOWN一樣,如果為負數,行為和ROUND_UP一樣

五、小結

以上就是我對數學相關類的總結以及個人的理解,如果有任何不清楚的,可以去看官方文檔(API官方文檔地址:https://docs.oracle.com/javase/8/docs/api/),其實,很多人都很排斥看源碼和閱讀官網文檔,原因就是源碼和閱讀官網文檔都是全英文的,解讀起來很費時間;其實這是一種不好的學習方式,源碼和閱讀官網文檔是最官方權威的第一手資料,也是最正確的,如果我們去網上看其他的相關解讀,這也只能是他人的解讀,而其他人的解讀就代表了他對源碼和閱讀官網文檔的個人理解,而這個理解是可能會有出入的,也就是可能會誤導我們,所以我們一定要養成習慣去閱讀源碼和閱讀官網文檔,可能剛開始的確很慢,但是慢慢的就你的閱讀速度和效率就會提高的。


公眾號:良許Linux

有收穫?希望老鐵們來個三連擊,給更多的人看到這篇文章


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • import shelve a = shelve.open('1') b = [1,2,3] a['b'] = b a.close()a['b'] Traceback (most recent call last):File "C:\Users\Administrator\AppData\Local ...
  • 最近在折騰一些控制相關的軟體設計,想起來狀態機這個東西,對解決一些控制系統狀態切換還是挺有用的。 狀態機(有限狀態自動機)網上有很多介紹。簡單理解就是定義一系列狀態,通過一系列的事件,可以使得狀態可以相互之間切換。 如果不使用狀態機的思想來編程,那麼針對過程的編程方法會使得程式拓展性變差,並且不容易 ...
  • 悲哀的就是,想吃技術飯,那就要走專家路線,但是中國軟體開發絕大多數是應用,能給得起錢的也是應用,對專家的需求就沒多少。 這條路才真的是獨木橋,走到後來,你會發現,你潛心研究的技術都是狗屁,不賺錢。 例如某個回答里提到的,悲觀鎖樂觀鎖。我也曾經喜歡研究這類問題,但是後來我發現,一個框架就搞定了。我們的 ...
  • 委托與事件在C#1.0的時候就有了,隨著C#版本的不斷更新,有些寫法和功能也在不斷改變。本文溫故一下這些改變,以及在NET Core中關於事件的一點改變。 一、C#1.0 從委托開始 1. 基本方式 什麼是委托,就不說概念了,用例子說話。 某HR說他需要招聘一個6年 .NET5 研發經驗的“高級”工 ...
  • 使用邏輯式編程找出凶手! Boddy 先生死於謀殺,現有六個嫌疑犯,每個人在不同的房間,每間房間各有一件可能的凶器,但不知道嫌疑犯、房間、凶器的對應關係。請根據條件和線索,找出誰是凶手。 ...
  • 演示地址:http://demo.ineuos.net (註:自己註冊) iNeuOS 自主可控工業互聯網操作系統,提供全新解決方案 核心組件包括:邊緣網關(iNeuLink)、設備容器(iNeuKernel)、Web組態視圖建模(iNeuView)、機器學習(iNeuAI)、分析大屏(iNeuDA ...
  • 在C#中將帶時區的字元串轉成DateTime類型需要用到DateTimeFormatInfo,這個類包含特定於區域性的信息。 例如,將Sun, 28 Jun 2020 03:40:22 GMT轉成DateTime該怎麼弄呢? DateTimeFormatInfo dtFormat = new Dat ...
  • 項目背景及需求說明 這是一個數據管理"工具類"的系統,計劃有三個核心功能: 1、通過界面配置相關連接字元串,查詢資料庫的表數據。 2、配置相關模板,生成資料庫表。 可以界面填報或通過Excel導入導出填報表數據。 3、通過界面配置導出資料庫表結構(數據字典)。 通過以上功能,在數據分析、可視化項目中 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...