Java中涉及到金錢計算方法的兩種方式


一.不直接使用float和double計算金錢的原因

java中涉及到浮點計算,就會有誤差,

float和double只能用來做科學計算或者是工程計算,在商業計算中我們要用 java.math.BigDecimal。

 1 public class MoneyTest{ 
 2 
 3 public static void main(String[] args) { 
 4 System.out.println(2.00 - 1.10);// 0.8999999999999999 
 5 
 6 System.out.println(2.00D - 1.10D);// 0.8999999999999999 
 7 
 8 System.out.println(2.00F - 1.10F);// 0.9 
 9 System.out.println(Double.toString(2.00D));// 2.0 
10 
11 System.out.println(BigDecimal.valueOf(2.00).subtract(BigDecimal.valueOf(1.10)));// 0.9 
12 System.out.println(BigDecimal.valueOf(2.00F).subtract(BigDecimal.valueOf(1.10F)));// 0.899999976158142 
13 
14 System.out.println(BigDecimal.valueOf(2.00D).subtract(BigDecimal.valueOf(1.10D)));// 0.9 
15 
16 System.out.println(new BigDecimal("2.00").subtract(new BigDecimal("1.10")));// 0.90 
17 
18 } 
19 
20 }

二.方法一:直接使用BigDecimal類(如果沒有什么邏輯處理建議直接使用BigDecimal)

1.加減乘除

 

//加法
BigDecimal result1 = num1.add(num2);
//減法
BigDecimal result2 = num1.subtract(num2);
//乘法
BigDecimal result3 = num1.multiply(num2);
//絕對值
BigDecimal result4 = num3.abs();
//除法
BigDecimal result5 = num2.divide(num1,20,BigDecimal.ROUND_HALF_UP)

 

加減乘除使用了英文的加減乘除, 即add, substract, multiply和divide

2.大小比較

 

bigdemical.compareTo(bigdemical2) = 1,表示bigdemical大於bigdemical2;
bigdemical.compareTo(bigdemical2) = 0,表示bigdemical等於bigdemical2;
bigdemical.compareTo(bigdemical2) = -1,表示bigdemical小於bigdemical2;

 

兩個BigDecimal值比較使用compareTo方法, 比較結果有-1, 0, 1, 分別表示小於, 等於, 大於; 對於0, 可以使用BigDecimal.ZERO表示!

3.小數位數及四舍五入規則

在項目中, 涉及到稅費的計算, 計算的結果可能是小數點后面十幾位, 那么怎么進行結算呢? 這就需要四舍五入這種東東了.

  1. BigDecimal b =  new BigDecimal("2.225667").setScale(2, BigDecimal.ROUND_DOWN);
  2. System.out.println(b); //2.22 直接去掉多余的位數
    四舍五入精確的方法很多很多,此例子只是直接去掉多余的位數

3.數據類型

BigDecimal在進行入庫時, 數據庫選擇decimal類型, 長度可以自定義, 如18; 小數點我們項目中用的是2, 保留2位小數. 此外還要注意的就是默認值, 一定寫成0.00, 不要用默認的NULL, 否則在進行加減排序等操作時, 會帶來轉換的麻煩!

數據庫字段類型:balance decimal(18,2) DEFAULT '0.00' COMMENT '賬戶余額', 

java對象:直接使用 BigDecimal 作為參數類型;

三:方法二:使用分元轉換類:如果金錢處理的邏輯很多建議使用分元轉換

 1 /**
 2 * 將元變成分 如 0.01元 變成 1分
 3 * 
 4 * @param str
 5 * 金額(元)
 6 * @return
 7 */
 8 public static String moneyYuanToFen(String str) {
 9         Double num = Double.parseDouble(str);
10         int result = (int) (num * 100);
11         return String.valueOf(result);
12     
13 }
14 
15 /**
16 * 將分變成元 100分 -> 1元
17 * 
18 * @param amount
19 * 金額(分)
20 * @return
21 */
22 public static String moneyFenToYuan(Long amount) {
23 return new BigDecimal(amount).divide(new BigDecimal(100)).setScale(2).toString();
24 }

 

原文:https://blog.csdn.net/OliverAAAAAA/article/details/79230979


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM