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類
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
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類型的數值運算
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
|
/** * 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中創建時如下:
1
2
|
@Column (columnDefinition= "decimal(18,2)" ) private BigDecimal price; //商品價格 |
在數據庫中創建時如下:
常用構造器:
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對象中的值轉換成整數
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持服務器之家。如有錯誤或未考慮完全的地方,望不吝賜教。
原文鏈接:https://mailiang.blog.csdn.net/article/details/87898547