av一区二区在线观看_亚洲男人的天堂网站_日韩亚洲视频_在线成人免费_欧美日韩精品免费观看视频_久草视

您的位置:首頁技術(shù)文章
文章詳情頁

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

瀏覽:32日期:2022-08-16 15:33:56

float和double只能用來做科學(xué)計算或者是工程計算,在商業(yè)計算中我們要用 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的計算

金額的計算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ù)值運算

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

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

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

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

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

常用構(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)驗,希望能給大家一個參考,也希望大家多多支持好吧啦網(wǎng)。如有錯誤或未考慮完全的地方,望不吝賜教。

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: va精品| 欧美一卡二卡在线观看 | 亚洲精品www | 午夜免费福利电影 | 91精品久久久 | 一区二区精品在线 | 国产精久久久 | 成年人免费看的视频 | 夜夜爆操 | 国产成人精品区一区二区不卡 | 日韩激情在线 | 精品国产乱码久久久久久图片 | 羞羞视频一区二区 | 国产乱码精品一区二区三区中文 | 免费一区二区 | 91看片网 | 欧美在线观看一区 | 色爽女| 日韩中文电影 | 久久久无码精品亚洲日韩按摩 | 国产精品99久久久久久动医院 | 中文字幕人成乱码在线观看 | 精品欧美| 国产精品亚洲精品 | 四虎影 | 午夜影院网站 | 视频一区二区三区中文字幕 | 丁香婷婷成人 | 日日干日日色 | 久久精品99国产精品 | 欧美激情国产精品 | 亚洲精品乱码久久久久久蜜桃 | 亚洲高清免费 | h视频在线免费 | 成人午夜电影在线观看 | 精品国产乱码久久久久久丨区2区 | 久久久噜噜噜久久中文字幕色伊伊 | 日韩欧美在线精品 | 国产精品久久久久久久一区探花 | 国产不卡一区 | 视频一区二区在线观看 |