色综合图-色综合图片-色综合图片二区150p-色综合图区-玖玖国产精品视频-玖玖香蕉视频

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

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

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

float和double只能用來(lái)做科學(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ù)會(huì)四舍五入到整數(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ù)(如果超過(guò)會(huì)四舍五入)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ù)(如果超過(guò)會(huì)四舍五入)str = percent.format(format);//1,234,317,160.00%二、典型的Double類型的數(shù)值運(yùn)算

/** * double的計(jì)算不精確,會(huì)有類似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 兩個(gè)參數(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 兩個(gè)參數(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 兩個(gè)參數(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(); } /** * 提供(相對(duì))精確的除法運(yùn)算,當(dāng)發(fā)生除不盡的情況時(shí), 精確到小數(shù)點(diǎn)以后10位,以后的數(shù)字四舍五入。 * * @param dividend 被除數(shù) * @param divisor 除數(shù) * @return 兩個(gè)參數(shù)的商 */ public static Double divide(Double dividend, Double divisor) { return divide(dividend, divisor, DEF_DIV_SCALE); } /** * 提供(相對(duì))精確的除法運(yùn)算。 當(dāng)發(fā)生除不盡的情況時(shí),由scale參數(shù)指定精度,以后的數(shù)字四舍五入。 * * @param dividend 被除數(shù) * @param divisor 除數(shù) * @param scale 表示表示需要精確到小數(shù)點(diǎn)以后幾位。 * @return 兩個(gè)參數(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存儲(chǔ)金額解決方案BigDecimal

使用BigDecimal來(lái)存儲(chǔ)金額數(shù)據(jù),數(shù)據(jù)庫(kù)中使用decimal類型,長(zhǎng)度18,小數(shù)點(diǎn)2。

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

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

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

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

常用構(gòu)造器:

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

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

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

常用方法:加減乘除

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

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

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

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

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

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

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

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

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

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

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持好吧啦網(wǎng)。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教。

標(biāo)簽: Java
相關(guān)文章:
主站蜘蛛池模板: 欧洲亚洲一区 | 精品亚洲一区二区 | 国产日产精品_国产精品毛片 | 久久er精品热线免费 | 老妇综合久久香蕉蜜桃 | 成人午夜在线播放 | 欧美另类色 | 国产午夜免费不卡精品理论片 | 精品久久久久久久久中文字幕 | 女人扒开双腿让男人捅 | 亚洲男女免费视频 | 日本一区二区三区四区不卡 | 欧美一级在线免费观看 | 亚洲精品国产成人一区二区 | 亚洲国产系列久久精品99人人 | 一级高清毛片免费a级高清毛片 | 怡红院免费全部视频在线视频 | 综合国产 | 114毛片免费观看网站 | 成人免费福利网站在线看 | 欧美成人26uuu欧美毛片 | 美女一级毛片免费观看 | 国产欧美日韩成人 | 亚洲欧美日韩国产精品影院 | 黄色国产免费观看 | 色偷偷亚洲女人天堂观看欧 | 亚洲性xx| 九九re6精品视频在线观看 | 午夜性a一级毛片 | 国产高清美女一级a毛片久久 | 欧美一级毛片不卡免费观看 | 日韩中文字幕网 | 韩国19禁主播裸免费福利 | 成人一级片在线观看 | 国产三级做爰在线观看视频 | 国产一级视频在线观看 | 精品国产美女福利到在线不卡 | 久久99精品九九九久久婷婷 | 女人张开腿让男人桶免费网站 | 亚洲欧美一区二区三区孕妇 | 亚洲一区二区三区精品影院 |