解決Java數值範圍以及float與double精度丟失的問題(java 浮點數 誤差)

解決Java數值範圍以及float與double精度丟失的問題(java 浮點數 誤差)

解決Java數值範圍以及float與double精度丟失的問題(java 浮點數 誤差)



資料來源: https://codertw.com/%E7%A8%8B%E5%BC%8F%E8%AA%9E%E8%A8%80/307448/



解決方法程式碼(使用BigDecimal解決)

import java.math.BigDecimal; 
/** 
* 由於Java的簡單型別不能夠精確的對浮點數進行運算,這個工具類提供精 
* 確的浮點數運算,包括加減乘除和四捨五入。 
*/ 
public class Arith
{ 
 //預設除法運算精度 
 private static final int DEF_DIV_SCALE = 10; 
 //這個類不能例項化 
 private Arith(){ 
 } 
 /** 
 * 提供精確的加法運算。 
 * @param v1 被加數 
 * @param v2 加數 
 * @return 兩個引數的和 
 */ 
 public static double add(double v1,double v2){ 
 BigDecimal b1 = new BigDecimal(Double.toString(v1)); 
 BigDecimal b2 = new BigDecimal(Double.toString(v2)); 
 return b1.add(b2).doubleValue(); 
 } 
 /** 
 * 提供精確的減法運算。 
 * @param v1 被減數 
 * @param v2 減數 
 * @return 兩個引數的差 
 */ 
 public static double sub(double v1,double v2){ 
 BigDecimal b1 = new BigDecimal(Double.toString(v1)); 
 BigDecimal b2 = new BigDecimal(Double.toString(v2)); 
 return b1.subtract(b2).doubleValue(); 
 } 
 /** 
 * 提供精確的乘法運算。 
 * @param v1 被乘數 
 * @param v2 乘數 
 * @return 兩個引數的積 
 */ 
 public static double mul(double v1,double v2){ 
 BigDecimal b1 = new BigDecimal(Double.toString(v1)); 
 BigDecimal b2 = new BigDecimal(Double.toString(v2)); 
 return b1.multiply(b2).doubleValue(); 
 } 
 /** 
 * 提供(相對)精確的除法運算,當發生除不盡的情況時,精確到 
 * 小數點以後10位,以後的數字四捨五入。 
 * @param v1 被除數 
 * @param v2 除數 
 * @return 兩個引數的商 
 */ 
 public static double div(double v1,double v2){ 
 return div(v1,v2,DEF_DIV_SCALE); 
 } 
 /** 
 * 提供(相對)精確的除法運算。當發生除不盡的情況時,由scale引數指 
 * 定精度,以後的數字四捨五入。 
 * @param v1 被除數 
 * @param v2 除數 
 * @param scale 表示表示需要精確到小數點以後幾位。 
 * @return 兩個引數的商 
 */ 
 public static double div(double v1,double v2,int scale){ 
 if(scale<0){ 
 throw new IllegalArgumentException( 
 "The scale must be a positive integer or zero"); 
 } 
 BigDecimal b1 = new BigDecimal(Double.toString(v1)); 
 BigDecimal b2 = new BigDecimal(Double.toString(v2)); 
 return b1.divide(b2,scale,BigDecimal.ROUND_HALF_UP).doubleValue(); 
 } 
 /** 
 * 提供精確的小數位四捨五入處理。 
 * @param v 需要四捨五入的數字 
 * @param scale 小數點後保留幾位 
 * @return 四捨五入後的結果 
 */ 
 public static double round(double v,int scale){ 
 if(scale<0){ 
 throw new IllegalArgumentException( 
 "The scale must be a positive integer or zero"); 
 } 
 BigDecimal b = new BigDecimal(Double.toString(v)); 
 BigDecimal one = new BigDecimal("1"); 
 return b.divide(one,scale,BigDecimal.ROUND_HALF_UP).doubleValue(); 
 } 
}; 

One thought on “解決Java數值範圍以及float與double精度丟失的問題(java 浮點數 誤差)

  1. 剛才使用 線上編譯器測試C#和C/C++

    不會有浮點數 誤差問題
    float f1=1.3;
    float f2=2.6;
    float f3=f1+f2;

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *