国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁技術文章
文章詳情頁

java 使用BigDecimal進行貨幣金額計算的操作

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

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
相關文章:
主站蜘蛛池模板: 久久亚洲国产精品五月天 | 亚洲夜| 欧美高清性色生活 | 亚洲系列国产系列 | 国产成人久久精品一区二区三区 | 欧美性videofree精品 | 欧美在线观看成人高清视频 | 网站在线看 | 在线成人精品国产区免费 | 美女张开腿让男人桶爽动漫视频 | 色国产精品 | 国产欧美日韩图片一区二区 | 亚洲欧美综合视频 | 久久久亚洲国产精品主播 | 亚洲综合黄色 | 亚洲精品国产字幕久久不卡 | 80岁色老头69av | 久9视频这里只有精品 | 欧美日韩一| 成年人在线观看视频网站 | 成人综合网址 | 在线观看亚洲免费视频 | 综合558欧美成人永久网站 | 欧美在线1 | 伊人狠狠丁香婷婷综合色 | 久久久不卡国产精品一区二区 | 亚洲精品国自产拍影院 | 亚洲国产欧美视频 | 亚洲福利视频一区二区三区 | 精品国产91在线网 | 2021国产成人精品久久 | 日韩精品久久一区二区三区 | www.欧美成人 | 天干夜天天夜天干天ww | 欧美日本一区亚洲欧美一区 | 日韩免费观看一级毛片看看 | 日本三级欧美三级 | 黄视频欧美 | 欧美色综合高清视频在线 | 欧美ⅹxxxx视频 | 亚洲成人免费网址 |