Posted on 2009-10-21 16:27
Gavin.lee 閱讀(1754)
評論(0) 編輯 收藏 所屬分類:
java SE & EE
import java.math.BigDecimal;

public class Test
{

public static void main(String args[])
{

try
{
BigDecimal d = new BigDecimal(40).divide(new BigDecimal(40));

} catch (ArithmeticException e)
{
String msg = e.getMessage();

if (msg.indexOf("Non-terminating") > -1)
{
System.out.println("Non-terminating");//無窮
}
}
}
}
在找這個用法的同時,查到BigDecimal的相關用法,據說是用來商業精確運算的,先摘下來,說不定某天能用到
package com.Gavin.tools;

import java.math.BigDecimal;


public class Arith
{


/** *//**
第一種:BigDecimal(double val)
Translates a double into a BigDecimal.

第二種:BigDecimal(String val)
Translates the String repre sentation of a BigDecimal into a BigDecimal.

使用BigDecimal要用String來夠造,要做一個加法運算,需要先將兩個浮點數轉為String,然后夠造成BigDecimal,在其中一個上調用add方法,傳入另一個作為參數,然后把運算的結果(BigDecimal)再轉換為浮點數。

public static double add(double v1,double v2)
public static double sub(double v1,double v2)
public static double mul(double v1,double v2)
public static double div(double v1,double v2)
public static double div(double v1,double v2,int scale)
public static double round(double v,int scale)
*/


/** *//**
* 由于Java的簡單類型不能夠精確的對浮點數進行運算,這個工具類提供精
* 確的浮點數運算,包括加減乘除和四舍五入。
*/
//默認除法運算精度
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();
}


/** *//**
* 提供精確的類型轉換(Float)
* @param v 需要被轉換的數字
* @return 返回轉換結果
*/

public static float convertsToFloat(double v)
{
BigDecimal b = new BigDecimal(v);
return b.floatValue();
}


/** *//**
* 提供精確的類型轉換(Int)不進行四舍五入,直接截取
* @param v 需要被轉換的數字
* @return 返回轉換結果
*/

public static int convertsToInt(double v)
{
BigDecimal b = new BigDecimal(v);
return b.intValue();
}


/** *//**
* 提供精確的類型轉換(Long)
* @param v 需要被轉換的數字
* @return 返回轉換結果
*/

public static long convertsToLong(double v)
{
BigDecimal b = new BigDecimal(v);
return b.longValue();
}


/** *//**
* 返回兩個數中大的一個值
* @param v1 需要被對比的第一個數
* @param v2 需要被對比的第二個數
* @return 返回兩個數中大的一個值
*/

public static double returnMax(double v1, double v2)
{
BigDecimal b1 = new BigDecimal(v1);
BigDecimal b2 = new BigDecimal(v2);
return b1.max(b2).doubleValue();
}


/** *//**
* 返回兩個數中小的一個值
* @param v1 需要被對比的第一個數
* @param v2 需要被對比的第二個數
* @return 返回兩個數中小的一個值
*/

public static double returnMin(double v1, double v2)
{
BigDecimal b1 = new BigDecimal(v1);
BigDecimal b2 = new BigDecimal(v2);
return b1.min(b2).doubleValue();
}


/** *//**
* 精確對比兩個數字
* @param v1 需要被對比的第一個數
* @param v2 需要被對比的第二個數
* @return 如果兩個數一樣則返回0,如果第一個數比第二個數大則返回1,反之返回-1
*/

public static int compareTo(double v1, double v2)
{
BigDecimal b1 = new BigDecimal(v1);
BigDecimal b2 = new BigDecimal(v2);
return b1.compareTo(b2);
}

}