欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

java 使用BigDecimal進(jìn)行貨幣金額計(jì)算的操作

 更新時間:2021年02月19日 14:26:20   作者:柚子君.  
這篇文章主要介紹了java 使用BigDecimal進(jìn)行貨幣金額計(jì)算的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧

float和double只能用來做科學(xué)計(jì)算或者是工程計(jì)算,在商業(yè)計(jì)算中我們要用 java.math.BigDecimal。

而且使用BigDecimal類也可以進(jìn)行大數(shù)的操作。

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

一、 BigDecimal的計(jì)算

金額的計(jì)算BigDecimal類

double d = 9.84;
double d2 = 1.22;
//注意需要使用BigDecimal(String val)構(gòu)造方法
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位小數(shù)
BigDecimal bigDecimalDivide = bigDecimal.divide(bigDecimal2, scale, BigDecimal.ROUND_HALF_UP);
double divide = bigDecimalDivide.doubleValue();
//格式化
double format = 12343171.6;
//獲取常規(guī)數(shù)值格式
NumberFormat number = NumberFormat.getNumberInstance();
String str = number.format(format);//12,343,171.6
//獲取整數(shù)數(shù)值格式
NumberFormat integer = NumberFormat.getIntegerInstance();
str = integer.format(format);//如果帶小數(shù)會四舍五入到整數(shù)12,343,172
//獲取貨幣數(shù)值格式
NumberFormat currency = NumberFormat.getCurrencyInstance();
currency.setMinimumFractionDigits(2);//設(shè)置數(shù)的小數(shù)部分所允許的最小位數(shù)(如果不足后面補(bǔ)0)
currency.setMaximumFractionDigits(4);//設(shè)置數(shù)的小數(shù)部分所允許的最大位數(shù)(如果超過會四舍五入)
str = currency.format(format);//¥12,343,171.60
//獲取顯示百分比的格式
NumberFormat percent = NumberFormat.getPercentInstance();
percent.setMinimumFractionDigits(2);//設(shè)置數(shù)的小數(shù)部分所允許的最小位數(shù)(如果不足后面補(bǔ)0)
percent.setMaximumFractionDigits(3);//設(shè)置數(shù)的小數(shù)部分所允許的最大位數(shù)(如果超過會四舍五入)
str = percent.format(format);//1,234,317,160.00%

二、典型的Double類型的數(shù)值運(yùn)算

/**
 * double的計(jì)算不精確,會有類似0.0000000000000002的誤差,正確的方法是使用BigDecimal或者用整型
 * 整型地方法適合于貨幣精度已知的情況,比如12.11+1.10轉(zhuǎn)成1211+110計(jì)算,最后再/100即可
 * 以下是摘抄的BigDecimal方法:
 */
public class DoubleUtil implements Serializable {
 private static final long serialVersionUID = -3345205828566485102L;
 // 默認(rèn)除法運(yùn)算精度
 private static final Integer DEF_DIV_SCALE = 2;
 /**
  * 提供精確的加法運(yùn)算。
  *
  * @param value1 被加數(shù)
  * @param value2 加數(shù)
  * @return 兩個參數(shù)的和
  */
 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();
 }
 /**
  * 提供精確的減法運(yùn)算。
  *
  * @param value1 被減數(shù)
  * @param value2 減數(shù)
  * @return 兩個參數(shù)的差
  */
 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();
 }
 /**
  * 提供精確的乘法運(yùn)算。
  *
  * @param value1 被乘數(shù)
  * @param value2 乘數(shù)
  * @return 兩個參數(shù)的積
  */
 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();
 }
 /**
  * 提供(相對)精確的除法運(yùn)算,當(dāng)發(fā)生除不盡的情況時, 精確到小數(shù)點(diǎn)以后10位,以后的數(shù)字四舍五入。
  *
  * @param dividend 被除數(shù)
  * @param divisor 除數(shù)
  * @return 兩個參數(shù)的商
  */
 public static Double divide(Double dividend, Double divisor) {
  return divide(dividend, divisor, DEF_DIV_SCALE);
 }
 /**
  * 提供(相對)精確的除法運(yùn)算。 當(dāng)發(fā)生除不盡的情況時,由scale參數(shù)指定精度,以后的數(shù)字四舍五入。
  *
  * @param dividend 被除數(shù)
  * @param divisor 除數(shù)
  * @param scale 表示表示需要精確到小數(shù)點(diǎn)以后幾位。
  * @return 兩個參數(shù)的商
  */
 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();
 }
 /**
  * 提供指定數(shù)值的(精確)小數(shù)位四舍五入處理。
  *
  * @param value 需要四舍五入的數(shù)字
  * @param scale 小數(shù)點(diǎn)后保留幾位
  * @return 四舍五入后的結(jié)果
  */
 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();
 }
}

補(bǔ)充:Java存儲金額解決方案BigDecimal

使用BigDecimal來存儲金額數(shù)據(jù),數(shù)據(jù)庫中使用decimal類型,長度18,小數(shù)點(diǎn)2。

在JPA中創(chuàng)建時如下:

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

在數(shù)據(jù)庫中創(chuàng)建時如下:

常用構(gòu)造器:

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

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

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

常用方法:加減乘除

add(BigDecimal) BigDecimal對象中的值相加,返回BigDecimal對象

subtract(BigDecimal) BigDecimal對象中的值相減,返回BigDecimal對象

multiply(BigDecimal) BigDecimal對象中的值相乘,返回BigDecimal對象

divide(BigDecimal) BigDecimal對象中的值相除,返回BigDecimal對象

常用方法:數(shù)據(jù)轉(zhuǎn)換

toString() 將BigDecimal對象中的值轉(zhuǎn)換成字符串

doubleValue() 將BigDecimal對象中的值轉(zhuǎn)換成雙精度數(shù)

floatValue() 將BigDecimal對象中的值轉(zhuǎn)換成單精度數(shù)

longValue() 將BigDecimal對象中的值轉(zhuǎn)換成長整數(shù)

intValue() 將BigDecimal對象中的值轉(zhuǎn)換成整數(shù)

以上為個人經(jīng)驗(yàn),希望能給大家一個參考,也希望大家多多支持腳本之家。如有錯誤或未考慮完全的地方,望不吝賜教。

相關(guān)文章

  • Java中的Calendar日歷API用法完全解析

    Java中的Calendar日歷API用法完全解析

    今天特別整理了針對Java中的Calendar日歷API用法完全解析,通過Calendar API我們可以對Calendar所提供的時間日期字段進(jìn)行各種自定義操作,首先還是從Calendar的基礎(chǔ)入手:
    2016-06-06
  • Java17和springboot3.0使用shiro報(bào)ClassNotFoundException的解決

    Java17和springboot3.0使用shiro報(bào)ClassNotFoundException的解決

    本文主要介紹了Java17和springboot3.0使用shiro報(bào)ClassNotFoundException的解決,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2024-04-04
  • SpringBoot?快速實(shí)現(xiàn)分庫分表的2種方式

    SpringBoot?快速實(shí)現(xiàn)分庫分表的2種方式

    本文將為您介紹?ShardingSphere?的一些基礎(chǔ)特性和架構(gòu)組成,以及在?Springboot?環(huán)境下通過JAVA編碼和Yml配置兩種方式快速實(shí)現(xiàn)分庫分表功能,感興趣的朋友跟隨小編一起看看吧
    2023-06-06
  • Java將Object轉(zhuǎn)換為數(shù)組的代碼

    Java將Object轉(zhuǎn)換為數(shù)組的代碼

    這篇文章主要介紹了Java將Object轉(zhuǎn)換為數(shù)組的情況,今天在使用一個別人寫的工具類,這個工具類,主要是判空操作,包括集合、數(shù)組、Map等對象是否為空的操作,需要的朋友可以參考下
    2022-09-09
  • Java AtomicInteger類的使用方法詳解

    Java AtomicInteger類的使用方法詳解

    這篇文章主要介紹了Java AtomicInteger類的使用方法詳解,文中有具體實(shí)例代碼,具有一定參考價值,需要的朋友可以了解下。
    2017-10-10
  • 深入理解Java中的HashMap

    深入理解Java中的HashMap

    HashMap是Java程序員使用頻率最高的用于映射(鍵值對)處理的數(shù)據(jù)類型。隨著JDK(Java Developmet Kit)版本的更新,JDK1.8對HashMap底層的實(shí)現(xiàn)進(jìn)行了優(yōu)化,例如引入紅黑樹的數(shù)據(jù)結(jié)構(gòu)和擴(kuò)容的優(yōu)化等。本文將深入探討HashMap的結(jié)構(gòu)實(shí)現(xiàn)和功能原理
    2021-06-06
  • Java8 Stream API 詳細(xì)使用方法與操作技巧指南

    Java8 Stream API 詳細(xì)使用方法與操作技巧指南

    這篇文章主要介紹了Java8 Stream API 詳細(xì)使用方法與操作技巧,總結(jié)分析了Java8 Stream API 基本功能、使用方法與操作注意事項(xiàng),需要的朋友可以參考下
    2020-05-05
  • 一文帶你初識java中的String類

    一文帶你初識java中的String類

    String代表字符串,Java 程序中的所有字符串字面值(如 "abc" )都作為此類的實(shí)例實(shí)現(xiàn),這篇文章主要給大家介紹了關(guān)于java中String類的相關(guān)資料,需要的朋友可以參考下
    2021-10-10
  • 解決IDEA創(chuàng)建第一個spring boot項(xiàng)目提示cannot resolve xxx等錯誤

    解決IDEA創(chuàng)建第一個spring boot項(xiàng)目提示cannot resolve xxx等

    這篇文章主要介紹了解決IDEA創(chuàng)建第一個spring boot項(xiàng)目提示cannot resolve xxx等錯誤問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-01-01
  • Springboot如何連接遠(yuǎn)程服務(wù)器上的數(shù)據(jù)庫實(shí)踐

    Springboot如何連接遠(yuǎn)程服務(wù)器上的數(shù)據(jù)庫實(shí)踐

    本文主要介紹了Springboot如何連接遠(yuǎn)程服務(wù)器上的數(shù)據(jù)庫實(shí)踐,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-04-04

最新評論