int變量與double變量混合運算時的常見問題及方法


int變量與double變量混合運算時的常見問題及方法

 

int變量與double變量混合運算時的常見問題及方法

例:

例:

 

 

 

 

 

 

 

 

 

 

很明顯這都不是我們需要的答案,原因:

1)由於計算機內部以二進制保存,所以十進制的有限位的小數,在計算機內部會是一個無限位的小數。
例如 十進制的0.9雖然只有一位小數,轉成2進制是無限循環小數0.1110011001100110011...

2)計算機保存浮點數的精度有限,例如float可以保留十進制最多7位(二進制23位)有效數字,double 可以保留十進制15~16位(二進制52位)有效數字。那有效數字以后的就被忽略了。
例如上面的0.9的表示受精度所限,精度以后的就被忽略了,這樣
float時,它是0.89999998
double時,它是0.90000000000000002

解決辦法:用Java提供給我們的一個內置類java.math.BigDecimal,來精確計算。

下面是這個工具類的使用方法:

 

 

 

 

1 public class Arith {
2 /**
3 * 提供精確加法計算的add方法
4 * @param value1 被加數
5 * @param value2 加數
6 * @return 兩個參數的和
7 */
8 public static double add(double value1,double value2){
9 BigDecimal b1 = new BigDecimal(Double.valueOf(value1));
10 BigDecimal b2 = new BigDecimal(Double.valueOf(value2));
11 return b1.add(b2).doubleValue();
12 }
13
14 /**
15 * 提供精確減法運算的sub方法
16 * @param value1 被減數
17 * @param value2 減數
18 * @return 兩個參數的差
19 */
20 public static double sub(double value1,double value2){
21 BigDecimal b1 = new BigDecimal(Double.valueOf(value1));
22 BigDecimal b2 = new BigDecimal(Double.valueOf(value2));
23 return b1.subtract(b2).doubleValue();
24 }
25
26 /**
27 * 提供精確乘法運算的mul方法
28 * @param value1 被乘數
29 * @param value2 乘數
30 * @return 兩個參數的積
31 */
32 public static double mul(double value1,double value2){
33 BigDecimal b1 = new BigDecimal(Double.valueOf(value1));
34 BigDecimal b2 = new BigDecimal(Double.valueOf(value2));
35 return b1.multiply(b2).doubleValue();
36 }
37
38 /**
39 * 提供精確的除法運算方法div
40 * @param value1 被除數
41 * @param value2 除數
42 * @param scale 精確范圍
43 * @return 兩個參數的商
44 * @throws IllegalAccessException
45 */
46 public static double div(double value1,double value2,int scale) throws IllegalAccessException{
47 //如果精確范圍小於0,拋出異常信息
48 if(scale<0){
49 throw new IllegalAccessException("精確度不能小於0");
50 }
51 BigDecimal b1 = new BigDecimal(Double.valueOf(value1));
52 BigDecimal b2 = new BigDecimal(Double.valueOf(value2));
53 return b1.divide(b2, scale).doubleValue();

 

 


免責聲明!

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



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