1. 程式人生 > >java BigDecimal用法詳解(保留小數,四捨五入,數字格式化,科學計數法轉數字等)

java BigDecimal用法詳解(保留小數,四捨五入,數字格式化,科學計數法轉數字等)

一、簡介

    Java在java.math包中提供的API類BigDecimal,用來對超過16位有效位的數進行精確的運算。雙精度浮點型變數double可以處理16位有效數。在實際應用中,需要對更大或者更小的數進行運算和處理。float和double只能用來做科學計算或者是工程計算,在商業計算中要用java.math.BigDecimal。BigDecimal所建立的是物件,我們不能使用傳統的+、-、*、/等算術運算子直接對其物件進行數學運算,而必須呼叫其相對應的方法。方法中的引數也必須是BigDecimal的物件。構造器是類的特殊方法,專門用來建立物件,特別是帶有引數的物件。

二、構造器描述

BigDecimal(int)       建立一個具有引數所指定整數值的物件。
BigDecimal(double) 建立一個具有引數所指定雙精度值的物件。
BigDecimal(long)    建立一個具有引數所指定長整數值的物件。
BigDecimal(String) 建立一個具有引數所指定以字串表示的數值的物件。

三、方法描述

add(BigDecimal)        BigDecimal物件中的值相加,然後返回這個物件。
subtract(BigDecimal) BigDecimal物件中的值相減,然後返回這個物件。
multiply(BigDecimal)  BigDecimal物件中的值相乘,然後返回這個物件。
divide(BigDecimal)     BigDecimal物件中的值相除,然後返回這個物件。
toString()                將BigDecimal物件的數值轉換成字串。
doubleValue()          將BigDecimal物件中的值以雙精度數返回。
floatValue()             將BigDecimal物件中的值以單精度數返回。
longValue()             將BigDecimal物件中的值以長整數返回。
intValue()               將BigDecimal物件中的值以整數返回。

四、常用方法

4.1、保留兩位小數
  1. /** 
  2.  * 保留兩位小數 
  3.  */
  4. @org.junit.Test  
  5. publicvoid formatTest() {  
  6.     double num=13.154215;  
  7.     //方式一
  8.     DecimalFormat df1 = new DecimalFormat("0.00");  
  9.     String str = df1.format(num);  
  10.     System.out.println(str);  //13.15
  11.     //方式二
  12.     // #.00 表示兩位小數 #.0000四位小數
  13.     DecimalFormat df2 =new DecimalFormat("#.00"
    );  
  14.     String str2 =df2.format(num);  
  15.     System.out.println(str2);  //13.15
  16.     //方式三
  17.     //%.2f %. 表示 小數點前任意位數   2 表示兩位小數 格式後的結果為f 表示浮點型
  18.     String result = String.format("%.2f", num);  
  19.     System.out.println(result);  //13.15
  20. }  

String.formate用法詳解:

  1. @Test
  2.     publicvoid test1() { //4.1541483776749997E9
  3.         double a = 4887233385.5;  
  4.         double b = 0.85;  
  5.         System.out.println("result1-->"+a*b);  // result1-->4.1541483776749997E9
  6.         BigDecimal a1 = new BigDecimal(a);  
  7.         BigDecimal b1 = new BigDecimal(b);  
  8.         System.out.println("result2-->"+a1.multiply(b1));//result2-->4154148377.674999891481619無限不迴圈
  9.         BigDecimal aBigDecimal = new BigDecimal(String.valueOf(a));  
  10.         BigDecimal bBigDecimal = new BigDecimal(String.valueOf(b));  
  11.         // 或者下面這種寫法
  12. //      BigDecimal aBigDecimal = new BigDecimal(Double.toString(a));
  13. //      BigDecimal bBigDecimal = new BigDecimal(Double.toString(b));
  14.         System.out.println("result3-->"+aBigDecimal.multiply(bBigDecimal)); //result3-->4154148377.675
  15.     }  
4.2、四捨五入
  1. /** 
  2.  * 四捨五入 
  3.  */
  4. @Test
  5. publicvoid test2() {  
  6.     double num = 111231.5585;  
  7.     BigDecimal b = new BigDecimal(num);  
  8.     //保留2位小數
  9.     double result = b.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();  
  10.     System.out.println(result);  //111231.56
  11. }  

BigDecimal.setScale()方法用於格式化小數點
setScale(1)表示保留一位小數,預設用四捨五入方式 
setScale(1,BigDecimal.ROUND_DOWN)直接刪除多餘的小數位,如2.35會變成2.3 
setScale(1,BigDecimal.ROUND_UP)進位處理,2.35變成2.4 
setScale(1,BigDecimal.ROUND_HALF_UP)四捨五入,2.35變成2.4

setScaler(1,BigDecimal.ROUND_HALF_DOWN)四捨五入,2.35變成2.3,如果是5則向下舍

setScaler(1,BigDecimal.ROUND_CEILING)接近正無窮大的舍入

setScaler(1,BigDecimal.ROUND_FLOOR)接近負無窮大的舍入,數字>0和ROUND_UP作用一樣,數字<0和ROUND_DOWN作用一樣

setScaler(1,BigDecimal.ROUND_HALF_EVEN)向最接近的數字舍入,如果與兩個相鄰數字的距離相等,則向相鄰的偶數舍入。

註釋:1:scale指的是你小數點後的位數。比如123.456則score就是3.score()就是BigDecimal類中的方法啊。
比如:BigDecimal b = new BigDecimal("123.456");
b.scale(),返回的就是3.
2:roundingMode是小數的保留模式。它們都是BigDecimal中的常量欄位,有很多種。
比如:BigDecimal.ROUND_HALF_UP表示的就是4舍5入。
3:pubilc BigDecimal divide(BigDecimal divisor, int scale, int roundingMode)
的意思是說:我用一個BigDecimal物件除以divisor後的結果,並且要求這個結果保留有scale個小數位,roundingMode表示的就是保留模式是什麼,是四捨五入啊還是其它的,你可以自己選!

4:對於一般add、subtract、multiply方法的小數位格式化如下:

BigDecimal mData = new BigDecimal("9.655").setScale(2, BigDecimal.ROUND_HALF_UP);
        System.out.println("mData=" + mData);
----結果:----- mData=9.66
4.3、格式化

    由於NumberFormat類的format()方法可以使用BigDecimal物件作為其引數,可以利用BigDecimal對超出16位有效數字的貨幣值,百分值,以及一般數值進行格式化控制。

  1. /** 
  2.  * 格式化 
  3.  */
  4. @Test
  5. publicvoid test3() {  
  6.     NumberFormat currency = NumberFormat.getCurrencyInstance(); //建立貨幣格式化引用
  7.     NumberFormat percent = NumberFormat.getPercentInstance();  //建立百分比格式化引用
  8.     percent.setMaximumFractionDigits(3); //百分比小數點最多3位
  9.     BigDecimal loanAmount = new BigDecimal("150.48"); //貸款金額
  10.     BigDecimal interestRate = new BigDecimal("0.008"); //利率
  11.     BigDecimal interest = loanAmount.multiply(interestRate); //相乘
  12.     System.out.println("貸款金額:\t" + currency.format(loanAmount)); //貸款金額: ¥150.48
  13.     System.out.println("利率:\t" + percent.format(interestRate));  //利率: 0.8%
  14.     System.out.println("利息:\t" + currency.format(interest)); //利息: ¥1.20
  15. }  
  1. @Test
  2. publicvoid test3() {  
  3.     DecimalFormat df = new DecimalFormat();  
  4.     double data = 1234.56789//格式化之前的數字
  5.     //1、定義要顯示的數字的格式(這種方式會四捨五入)
  6.     String style = "0.0";  
  7.     df.applyPattern(style);  
  8.     System.out.println("1-->" + df.format(data));  //1234.6
  9.     //2、在格式後新增諸如單位等字元
  10.     style = "00000.000 kg";  
  11.     df.applyPattern(style);  
  12.     System.out.println("2-->" + df.format(data));  //01234.568 kg
  13.     //3、 模式中的"#"表示如果該位存在字元,則顯示字元,如果不存在,則不顯示。
  14.     style = "##000.000 kg";  
  15.     df.applyPattern(style);  
  16.     System.out.println("3-->" + df.format(data));  //1234.568 kg
  17.     //4、 模式中的"-"表示輸出為負數,要放在最前面
  18.     style = "-000.000";  
  19.     df.applyPattern(style);  
  20.     System.out.println("4-->" + df.format(data)); //-1234.568
  21.     //5、 模式中的","在數字中新增逗號,方便讀數字
  22.     style = "-0,000.0#";  
  23.     df.applyPattern(style);  
  24.     System.out.println("5-->" + df.format(data));  //5-->-1,234.57
  25.     //6、模式中的"E"表示輸出為指數,"E"之前的字串是底數的格式,
  26.     // "E"之後的是字串是指數的格式
  27.     style = "0.00E000";  
  28.     df.applyPattern(style);  
  29.     System.out.println("6-->" + df.format(data));  //6-->1.23E003
  30.     //7、 模式中的"%"表示乘以100並顯示為百分數,要放在最後。
  31.     style = "0.00%";  
  32.     df.applyPattern(style);  
  33. 相關推薦

    Java BigDecimal使用 Java BigDecimal BigDecimal用法(保留兩位小數,四捨五入,數字格式化科學計數數字數字裡的逗號處理

    1.引言  float和double型別的主要設計目標是為了科學計算和工程計算。他們執行二進位制浮點運算,這是為了在廣域數值範圍上提供較為精確的快速近似計算而精心設計的。然而,它們沒有提供完全精確的結果,所以不應該被用於要求精確結果的場合。但是,商業計算往往要求結果精確,這時候BigDecimal

    java BigDecimal用法(保留小數,四捨五入,數字格式化科學計數數字

    一、簡介    Java在java.math包中提供的API類BigDecimal,用來對超過16位有效位的數進行精確的運算。雙精度浮點型變數double可以處理16位有效數。在實際應用中,需要對更大或者更小的數進行運算和處理。float和double只能用來做科學計算或者是

    BigDecimal用法(保留兩位小數,四捨五入,數字格式化科學計數數字數字裡的逗號處理

    一、簡介     Java在java.math包中提供的API類BigDecimal,用來對超過16位有效位的數進行精確的運算。雙精度浮點型變數double可以處理16位有效數。在實際應用中,需要對更大或者更小的數進行運算和處理。float和double只能用來做科學計算或

    BigDecimal用法(保留兩位小數,四舍五入,數字格式化科學計數數字數字裏的逗號處理

    intvalue tom 引用 方法 mda ubi 結果 oid 創建 一、簡介 Java在java.math包中提供的API類BigDecimal,用來對超過16位有效位的數進行精確的運算。雙精度浮點型變量doubl

    --BigDecimal用法

    </div> </div> </div> <article> <div id="article_content" class="article_content clearfix csdn-tracking-stat

    BigDecimal用法

    一.簡介 Java在java.math包中提供的API類BigDecimal,用來對超過16位有效位的數進行精確的運算。雙精度浮點型變數double可以處理16位有效數。在實際應用中,需要對更大或者更小的數進行運算和處理。float和double只能用來做科學計算或者是工程

    java wait用法

    一、wait(), notify(), notifyAll()等方法介紹 1.wait()的作用是讓當前執行緒進入等待狀態,同時,wait()也會讓當前執行緒釋放它所持有的鎖。“直到其他執行緒呼叫此物件的 notify() 方法或 notifyAll() 方法”,當前執行緒

    java Socket用法

         在客戶/伺服器通訊模式中, 客戶端需要主動建立與伺服器連線的 Socket(套接字), 伺服器端收到了客戶端的連線請求, 也會建立與客戶連線的 Socket. Socket可看做是通訊連線兩端的收發器, 伺服器與客戶端都通過 Socket 來收發資料. 這篇文章首

    Java反射用法

    在過去的幾次面試中,都被問到了反射這塊的知識,並沒有系統瞭解過Java的反射機制(現實是幾乎怎麼接觸過),所以這方面的問題基本都回答不上來T_T 鎮定思痛,我們來一起好好看看Java中反射的用法。 關於反射的基本用法, http://www.cnblogs.com/roll

    Java Scanner用法

    本文轉載自: 一、Scanner類簡介       Java 5添加了java.util.Scanner類,這是一個用於掃描輸入文字的新的實用程式。它是以前的StringTokenizer和Matcher類之間的某種結合。由於任何資料都必須通過同一模式的捕獲組檢索或

    Java NIO用法

    election 線程 tro conn .com 一次 關註 運行 bind 原文: https://my.oschina.net/zhangxufeng/blog/3048735 對於Java NIO,其主要由三個組件組成:Channel、Selector和Buffer

    Qt檔案操作(建立、寫入、刪除、INI、XML檔案

    1、建立資料夾 標頭檔案: #include <QDir> #include <QMessageBox> 核心程式碼如下: //例項QDir Q

    java科學計數普通數字表示 --toPlainString()和stripTrailingZeros()

    toPlainString() //轉為普遍計數法輸出 //給一個字串1.238761976E-10 //如何得到0.0000000001238761976這個字串呢? BigDecimal bd = new BigDecimal("1.238761976E-10");

    Java科學計數數字成完整的數字展示;double型別的小數值不準確的處理

    首先是從Excel裡面讀資料的時候,Excel裡面的資料是數字,太大,其實也不是數字,就是個銀行卡號,複製進去,就自動成數字啦,然後就變成科學計數法啦,在使用poi讀取資料的時候,讀出來的就是科學計數法

    Java 科學計數成完整數字展示;double類型小數值不準確處理

    eric def string 但是 讀取excel 參數 使用 bre 可能 首先是從Excel裏面讀數據的時候,Excel裏面的數據是數字,太大,其實也不是數字,就是個銀行卡號,復制進去,就自動成數字啦,然後就變成科學計數法啦,在使用poi讀取數據的時候,讀出來的就是科

    java提高篇-----java四捨五入保留

          四捨五入是我們小學的數學問題,這個問題對於我們程式猿來說就類似於1到10的加減乘除那麼簡單了。在講解之間我們先看如下一個經典的案例: public static void main(St

    java中的instanceof用法

    定義 xtend print 繼承 interface 參數 保留 如果 ack   instanceof是Java的一個二元操作符(運算符),也是Java的保留關鍵字。它的作用是判斷其左邊對象是否為其右邊類的實例,返回的是boolean類型的數據。用它來判斷某個對象是否是

    java中靜態代碼塊的用法—— static用法

    super關鍵字 了解 裝載 static關鍵字 super 屬於 註意 lock 自動 (一)java 靜態代碼塊 靜態方法區別一般情況下,如果有些代碼必須在項目啟動的時候就執行的時候,需要使用靜態代碼塊,這種代碼是主動執行的;需要在項目啟動的時候就初始化,在不創建對象的

    Java enum的用法

    num 所有 out 解決辦法 inter cli 語句 tel 白色 用法一:常量 在JDK1.5 之前,我們定義常量都是: public static fianl.... 。現在好了,有了枚舉,可以把相關的常量分組到一個枚舉類型裏,而且枚舉提供了比常量更多的方法。

    JAVA的Random類的用法

    Random類 (java.util)         Random類中實現的隨機演算法是偽隨機,也就是有規則的隨機。在進行隨機時,隨機演算法的起源數字稱為種子數(seed),在種子數的基礎上進行一定的變換,從而產生