Android 含極值的四捨五入計算
/**
* double 極值的定義
*/
double inf=1.0/0.0;//正無限大
double neginf=-1.0/0.0;//負無限大
double negzero=-1.0/inf;//負0
double NaN=0.0/0.0;//Not A Number
/**
* 含極值的四捨五入處理
* @param v 需要四捨五入的數位
* @param scale 小數點後保留幾位
* @return 四捨五入後的結果
*/
public double round(double v,int scale){
if(v==Double.POSITIVE_INFINITY)return inf;
if(v==Double.NEGATIVE_INFINITY)return neginf;
if(v==negzero)return negzero;
if(Double.isNaN(v))return NaN;
BigDecimal bd = new BigDecimal(Double.toString(v));
BigDecimal one = new BigDecimal("1");
if(scale<0)scale=0;//小數位數>=0
return bd.divide(one,scale,BigDecimal.ROUND_HALF_UP).doubleValue();
}
使用說明
在數學計算中,常常會用到四捨五入,例如求 Sin(x),求到小數6位,
但若是要求CSC(x)時,那可能就要面對分母為0的問題了,其實分母不是0
而是趨近於0,這就是極值問題。
BigDecimal 可以處裡極大值及+0 及-0值,但若是 NaN則會傳回錯誤,所以要檢查NaN
並直接傳回NaN。
註:NaN (Not A Number)
有關三角函數極值
sin(+0.0) = +0.0
sin(-0.0) = -0.0
sin(+infinity) = NaN
sin(-infinity) = NaN
sin(NaN) = NaN
cos(+infinity) = NaN
cos(-infinity) = NaN
cos(NaN) = NaN
tan(+0.0) = +0.0
tan(-0.0) = -0.0
tan(+infinity) = NaN
tan(-infinity) = NaN
tan(NaN) = NaN
參考文件
Java Floating-Point Number Intricacies
沒有留言:
張貼留言
請提供您的寶貴意見 ;-)