Posted on 2009-10-21 16:27
Gavin.lee 閱讀(1748)
評(píng)論(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");//無(wú)窮
}
}
}
}
在找這個(gè)用法的同時(shí),查到BigDecimal的相關(guān)用法,據(jù)說(shuō)是用來(lái)商業(yè)精確運(yùn)算的,先摘下來(lái),說(shuō)不定某天能用到
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來(lái)夠造,要做一個(gè)加法運(yùn)算,需要先將兩個(gè)浮點(diǎn)數(shù)轉(zhuǎn)為String,然后夠造成BigDecimal,在其中一個(gè)上調(diào)用add方法,傳入另一個(gè)作為參數(shù),然后把運(yùn)算的結(jié)果(BigDecimal)再轉(zhuǎn)換為浮點(diǎn)數(shù)。

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的簡(jiǎn)單類型不能夠精確的對(duì)浮點(diǎn)數(shù)進(jìn)行運(yùn)算,這個(gè)工具類提供精
* 確的浮點(diǎn)數(shù)運(yùn)算,包括加減乘除和四舍五入。
*/
//默認(rèn)除法運(yùn)算精度
private static final int DEF_DIV_SCALE = 10;

//這個(gè)類不能實(shí)例化

private Arith()
{
}


/** *//**
* 提供精確的加法運(yùn)算。
* @param v1 被加數(shù)
* @param v2 加數(shù)
* @return 兩個(gè)參數(shù)的和
*/

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();
}


/** *//**
* 提供精確的減法運(yùn)算。
* @param v1 被減數(shù)
* @param v2 減數(shù)
* @return 兩個(gè)參數(shù)的差
*/

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();
}


/** *//**
* 提供精確的乘法運(yùn)算。
* @param v1 被乘數(shù)
* @param v2 乘數(shù)
* @return 兩個(gè)參數(shù)的積
*/

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();
}


/** *//**
* 提供(相對(duì))精確的除法運(yùn)算,當(dāng)發(fā)生除不盡的情況時(shí),精確到
* 小數(shù)點(diǎn)以后10位,以后的數(shù)字四舍五入。
* @param v1 被除數(shù)
* @param v2 除數(shù)
* @return 兩個(gè)參數(shù)的商
*/

public static double div(double v1, double v2)
{
return div(v1, v2, DEF_DIV_SCALE);
}


/** *//**
* 提供(相對(duì))精確的除法運(yùn)算。當(dāng)發(fā)生除不盡的情況時(shí),由scale參數(shù)指
* 定精度,以后的數(shù)字四舍五入。
* @param v1 被除數(shù)
* @param v2 除數(shù)
* @param scale 表示表示需要精確到小數(shù)點(diǎn)以后幾位。
* @return 兩個(gè)參數(shù)的商
*/

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();
}


/** *//**
* 提供精確的小數(shù)位四舍五入處理。
* @param v 需要四舍五入的數(shù)字
* @param scale 小數(shù)點(diǎn)后保留幾位
* @return 四舍五入后的結(jié)果
*/

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();
}


/** *//**
* 提供精確的類型轉(zhuǎn)換(Float)
* @param v 需要被轉(zhuǎn)換的數(shù)字
* @return 返回轉(zhuǎn)換結(jié)果
*/

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


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

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


/** *//**
* 提供精確的類型轉(zhuǎn)換(Long)
* @param v 需要被轉(zhuǎn)換的數(shù)字
* @return 返回轉(zhuǎn)換結(jié)果
*/

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


/** *//**
* 返回兩個(gè)數(shù)中大的一個(gè)值
* @param v1 需要被對(duì)比的第一個(gè)數(shù)
* @param v2 需要被對(duì)比的第二個(gè)數(shù)
* @return 返回兩個(gè)數(shù)中大的一個(gè)值
*/

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


/** *//**
* 返回兩個(gè)數(shù)中小的一個(gè)值
* @param v1 需要被對(duì)比的第一個(gè)數(shù)
* @param v2 需要被對(duì)比的第二個(gè)數(shù)
* @return 返回兩個(gè)數(shù)中小的一個(gè)值
*/

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


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

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

}