BigDecimal失真問題

   BigDecimal用於對超過16位有效位的數進行精確計算

常用構造方法

1、BigDecimal(int)

創建一個具有參數所指定整數值的對象

2、BigDecimal(double)

創建一個具有參數所指定雙精度值的對象

3、BigDecimal(long)

創建一個具有參數所指定長整數值的對象

1、BigDecimal(String)

創建一個具有參數所指定字符串表示的數值的對象

問題分析

代碼示例:

BigDecimal a = new BigDecimal(0.1);

BigDecimal b = new BigDecimal("0.1");

System.out.println("a:"+ a);

System.out.println("b:"+ b);

 輸出:

a:0.1000000000000000055511151231257827021181583404541015625

b:0.1

原因分析:

參數類型爲double的構造方法的結果有一定的不可預知性,實際等於 0.1000000000000000055511151231257827021181583404541015625,因爲0.1無法準確的表示爲double;

String的構造方法是完全可預知的,b的值即爲預知的0.1。

常用方法:

  • add(BigDecimal)

BigDecimal對象中的值相加,返回BigDecimal對象

  • subtract(BigDecimal)

BigDecimal對象中的值相減,返回BigDecimal對象

  • multiply(BigDecimal)

BigDecimal對象中的值相乘,返回BigDecimal對象

  • divide(BigDecimal)

BigDecimal對象中的值相除,返回BigDecimal對象

  • toString()

將BigDecimal對象中的值轉換成字符串

  • doubleValue()

將BigDecimal對象中的值轉換成雙精度數

  • floatValue()

將BigDecimal對象中的值轉換成單精度數

  • longValue()

將BigDecimal對象中的值轉換成長整數

  • intValue()

將BigDecimal對象中的值轉換成整數

  • compareTo(BigDecimal2)

將調用該方法的BigDecimal對象與BigDecimal2做比較 

int a = bigdemical.compareTo(bigdemical2)

返回結果分析:

a = -1,表示bigdemical小於bigdemical2;
a = 0,表示bigdemical等於bigdemical2;
a = 1,表示bigdemical大於bigdemical2;

如果需要傳如double類型的數值到BigDecimal,建議使用如下方法:

BigDecimal b1 = new BigDecimal(Double.toString(v1));

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章