91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何在java中利用BigDecimal計算貨幣金額

發布時間:2021-02-20 16:08:25 來源:億速云 閱讀:428 作者:Leah 欄目:開發技術

今天就跟大家聊聊有關如何在java中利用BigDecimal計算貨幣金額,可能很多人都不太了解,為了讓大家更加了解,小編給大家總結了以下內容,希望大家根據這篇文章可以有所收獲。

float和double只能用來做科學計算或者是工程計算,在商業計算中我們要用 java.math.BigDecimal。

而且使用BigDecimal類也可以進行大數的操作。

方法類型描述
public BigDecimal(double val)構造將double表示形式轉換為BigDecimal
public BigDecimal(int val)構造將int表示形式轉換為BigDecimal
public BigDecimal(String val)構造將字符串表示形式轉換為BigDecimal
public BigDecimal add(BigDecimal augend)普通加法
public BigDecimal subtract(BigDecimal subtrahend)普通減法
public BigDecimal multiply(BigDecimal multiplicand)普通乘法
public BigDecimal divide(BigDecimal divisor)普通除法

一、 BigDecimal的計算

金額的計算BigDecimal類

double d = 9.84;
double d2 = 1.22;
//注意需要使用BigDecimal(String val)構造方法
BigDecimal bigDecimal = new BigDecimal(Double.toString(d));
BigDecimal bigDecimal2 = new BigDecimal(Double.toString(d2));
//加法
BigDecimal bigDecimalAdd = bigDecimal.add(bigDecimal2);
double add = bigDecimalAdd.doubleValue();
//減法
BigDecimal bigDecimalSubtract = bigDecimal.subtract(bigDecimal2);
double subtract = bigDecimalSubtract.doubleValue();
//乘法
BigDecimal bigDecimalMultiply = bigDecimal.multiply(bigDecimal2);
double multiply = bigDecimalMultiply.doubleValue();
//除法
int scale = 2;//保留2位小數
BigDecimal bigDecimalDivide = bigDecimal.divide(bigDecimal2, scale, BigDecimal.ROUND_HALF_UP);
double divide = bigDecimalDivide.doubleValue();
//格式化
double format = 12343171.6;
//獲取常規數值格式
NumberFormat number = NumberFormat.getNumberInstance();
String str = number.format(format);//12,343,171.6
//獲取整數數值格式
NumberFormat integer = NumberFormat.getIntegerInstance();
str = integer.format(format);//如果帶小數會四舍五入到整數12,343,172
//獲取貨幣數值格式
NumberFormat currency = NumberFormat.getCurrencyInstance();
currency.setMinimumFractionDigits(2);//設置數的小數部分所允許的最小位數(如果不足后面補0)
currency.setMaximumFractionDigits(4);//設置數的小數部分所允許的最大位數(如果超過會四舍五入)
str = currency.format(format);//¥12,343,171.60
//獲取顯示百分比的格式
NumberFormat percent = NumberFormat.getPercentInstance();
percent.setMinimumFractionDigits(2);//設置數的小數部分所允許的最小位數(如果不足后面補0)
percent.setMaximumFractionDigits(3);//設置數的小數部分所允許的最大位數(如果超過會四舍五入)
str = percent.format(format);//1,234,317,160.00%

二、典型的Double類型的數值運算

/**
 * double的計算不精確,會有類似0.0000000000000002的誤差,正確的方法是使用BigDecimal或者用整型
 * 整型地方法適合于貨幣精度已知的情況,比如12.11+1.10轉成1211+110計算,最后再/100即可
 * 以下是摘抄的BigDecimal方法:
 */
public class DoubleUtil implements Serializable {
 private static final long serialVersionUID = -3345205828566485102L;
 // 默認除法運算精度
 private static final Integer DEF_DIV_SCALE = 2;
 /**
  * 提供精確的加法運算。
  *
  * @param value1 被加數
  * @param value2 加數
  * @return 兩個參數的和
  */
 public static Double add(Double value1, Double value2) {
  BigDecimal b1 = new BigDecimal(Double.toString(value1));
  BigDecimal b2 = new BigDecimal(Double.toString(value2));
  return b1.add(b2).doubleValue();
 }
 /**
  * 提供精確的減法運算。
  *
  * @param value1 被減數
  * @param value2 減數
  * @return 兩個參數的差
  */
 public static double sub(Double value1, Double value2) {
  BigDecimal b1 = new BigDecimal(Double.toString(value1));
  BigDecimal b2 = new BigDecimal(Double.toString(value2));
  return b1.subtract(b2).doubleValue();
 }
 /**
  * 提供精確的乘法運算。
  *
  * @param value1 被乘數
  * @param value2 乘數
  * @return 兩個參數的積
  */
 public static Double mul(Double value1, Double value2) {
  BigDecimal b1 = new BigDecimal(Double.toString(value1));
  BigDecimal b2 = new BigDecimal(Double.toString(value2));
  return b1.multiply(b2).doubleValue();
 }
 /**
  * 提供(相對)精確的除法運算,當發生除不盡的情況時, 精確到小數點以后10位,以后的數字四舍五入。
  *
  * @param dividend 被除數
  * @param divisor 除數
  * @return 兩個參數的商
  */
 public static Double divide(Double dividend, Double divisor) {
  return divide(dividend, divisor, DEF_DIV_SCALE);
 }
 /**
  * 提供(相對)精確的除法運算。 當發生除不盡的情況時,由scale參數指定精度,以后的數字四舍五入。
  *
  * @param dividend 被除數
  * @param divisor 除數
  * @param scale 表示表示需要精確到小數點以后幾位。
  * @return 兩個參數的商
  */
 public static Double divide(Double dividend, Double divisor, Integer scale) {
  if (scale < 0) {
   throw new IllegalArgumentException("The scale must be a positive integer or zero");
  }
  BigDecimal b1 = new BigDecimal(Double.toString(dividend));
  BigDecimal b2 = new BigDecimal(Double.toString(divisor));
  return b1.divide(b2, scale,RoundingMode.HALF_UP).doubleValue();
 }
 /**
  * 提供指定數值的(精確)小數位四舍五入處理。
  *
  * @param value 需要四舍五入的數字
  * @param scale 小數點后保留幾位
  * @return 四舍五入后的結果
  */
 public static double round(double value,int scale){
  if(scale<0){
   throw new IllegalArgumentException("The scale must be a positive integer or zero");
  }
  BigDecimal b = new BigDecimal(Double.toString(value));
  BigDecimal one = new BigDecimal("1");
  return b.divide(one,scale, RoundingMode.HALF_UP).doubleValue();
 }
}

補充:Java存儲金額解決方案BigDecimal

使用BigDecimal來存儲金額數據,數據庫中使用decimal類型,長度18,小數點2。

在JPA中創建時如下:

@Column(columnDefinition="decimal(18,2)") 
private BigDecimal price; //商品價格

在數據庫中創建時如下:

如何在java中利用BigDecimal計算貨幣金額

常用構造器:

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

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

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

常用方法:加減乘除

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對象中的值轉換成整數

看完上述內容,你們對如何在java中利用BigDecimal計算貨幣金額有進一步的了解嗎?如果還想了解更多知識或者相關內容,請關注億速云行業資訊頻道,感謝大家的支持。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

汽车| 容城县| 荥阳市| 广水市| 五峰| 丽水市| 温州市| 长泰县| 中牟县| 抚顺市| 苗栗县| 拉萨市| 汶川县| 鸡西市| 阿合奇县| 南靖县| 阿瓦提县| 安达市| 荆州市| 英超| 邯郸市| 永川市| 正宁县| 肇东市| 漠河县| 东台市| 于都县| 栖霞市| 彭州市| 博爱县| 罗源县| 京山县| 蚌埠市| 云霄县| 石林| 搜索| 六盘水市| 夏津县| 顺义区| 汕尾市| 兴和县|