国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Java > 正文

介紹Java的大數類(BigDecimal)和八種舍入模式

2019-11-26 13:58:40
字體:
來源:轉載
供稿:網友

1.BigDecimal簡介

BigDecimal 由任意精度的整數非標度值 和32 位的整數標度 (scale) 組成。如果為零或正數,則標度是小數點后的位數。如果為負數,則將該數的非標度值乘以 10 的負scale 次冪。因此,BigDecimal表示的數值是(unscaledValue × 10-scale)。

2.BigDecimal的引入

在利用Java編程語言開發銀行、金融類等需要對數值進行高精度計算的軟件時,我們經常使用BigDecimalBigInteger這兩個大數類,而不是常見的intlongfloatdouble類型,特別是在處理浮點型數據。

我們先看一下使用基礎數據類型double進行計算并打印結果的一個代碼演示:

public class MainClass {  public static void main(String[] args) {    System.out.println(0.02+0.01);    System.out.println(0.05+0.01);  }}

結果如下:

0.030.060000000000000005

問題來了,為什么會出現第二種結果的數據呢?根本原因還是我們的計算機是由二進制的,而二進制是沒辦法來精確表示一個浮點數,CPU采用“尾數和指數”的方式(科學計數法)表達浮點數的時候存在一定的誤差。所以,當對數據精度要求比較高的時候,還是需要采用BigDecimal類,盡管計算速度上稍微慢了一些。

3.BigDecimal的使用

創建一個BigDecimal對象有構造函數和公有靜態方法(BigDecimal.valueOf)兩種方式,需要注意兩點:

      1、構造函數包含使用基本數據類型和字符串作為參數的兩種形式,推薦使用后者,如:new BigDecimal(Double.valueOf(0.09))。大家可以嘗試一下,System.out.println(new BigDecimal(0.06).toString());語句的輸出結果是:0.059999999999999997779553950749686919152736663818359375

      2、Decimal打印日志或向基本數據類型轉換時,盡量使用它提供的公有方法xxxValue(),比如doubleValue(),而不是簡單粗暴的一個toString()

4.BigDecimal舍入模式

盡管數據庫存儲的是一個高精度的浮點數,但是通常在應用中展示的時候往往需要限制一下小數點的位數,比如兩到三位小數即可,這時就需要使用到setScale(int newScale, int roundingMode)函數,作為BigDecimal的公有靜態變量,舍入模式(Rounding Mode)的運算規則比較多,公有八種,這里作個說明,官方文檔也有介紹。

1、ROUND_UP

向遠離零的方向舍入。舍棄非零部分,并將非零舍棄部分相鄰的一位數字加一。

2、ROUND_DOWN

向接近零的方向舍入。舍棄非零部分,同時不會非零舍棄部分相鄰的一位數字加一,采取截取行為。

3、ROUND_CEILING

向正無窮的方向舍入。如果為正數,舍入結果同ROUND_UP一致;如果為負數,舍入結果同ROUND_DOWN一致。注意:此模式不會減少數值大小。

4、ROUND_FLOOR

向負無窮的方向舍入。如果為正數,舍入結果同ROUND_DOWN一致;如果為負數,舍入結果同ROUND_UP一致。注意:此模式不會增加數值大小。

5、ROUND_HALF_UP

向“最接近”的數字舍入,如果與兩個相鄰數字的距離相等,則為向上舍入的舍入模式。如果舍棄部分>= 0.5,則舍入行為與ROUND_UP相同;否則舍入行為與ROUND_DOWN相同。這種模式也就是我們常說的我們的“四舍五入”。

6、ROUND_HALF_DOWN

向“最接近”的數字舍入,如果與兩個相鄰數字的距離相等,則為向下舍入的舍入模式。如果舍棄部分> 0.5,則舍入行為與ROUND_UP相同;否則舍入行為與ROUND_DOWN相同。這種模式也就是我們常說的我們的“五舍六入”。

7、ROUND_HALF_EVEN

向“最接近”的數字舍入,如果與兩個相鄰數字的距離相等,則相鄰的偶數舍入。如果舍棄部分左邊的數字奇數,則舍入行為與 ROUND_HALF_UP 相同;如果為偶數,則舍入行為與 ROUND_HALF_DOWN 相同。注意:在重復進行一系列計算時,此舍入模式可以將累加錯誤減到最小。此舍入模式也稱為“銀行家舍入法”,主要在美國使用。四舍六入,五分兩種情況,如果前一位為奇數,則入位,否則舍去。

8、ROUND_UNNECESSARY

斷言請求的操作具有精確的結果,因此不需要舍入。如果對獲得精確結果的操作指定此舍入模式,則拋出ArithmeticException。

下面,舉個例子說明一下不同舍入模式下的數值計算結果,保留一位小數:

5.總結

以上就是Java大數類BigDecimal及八種舍入模式的介紹的全部內容,希望本文的內容對大家學習Java能有所幫助。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 松潘县| 莆田市| 沐川县| 万山特区| 库尔勒市| 塘沽区| 阜平县| 常宁市| 山东省| 宾川县| 齐齐哈尔市| 嘉定区| 集安市| 武平县| 达日县| 西乡县| 仁寿县| 蓬莱市| 正镶白旗| 温泉县| 汉中市| 益阳市| 农安县| 邛崃市| 阿鲁科尔沁旗| 卢龙县| 红安县| 连云港市| 潮安县| 开江县| 许昌县| 鄂托克旗| 安阳县| 洪江市| 桃源县| 布尔津县| 浙江省| 黄梅县| 望谟县| 秀山| 高平市|