java浮點(diǎn)數(shù)運(yùn)算不準(zhǔn)確問題的解決
今天遇到了這樣的問題,就是浮點(diǎn)運(yùn)算后數(shù)據(jù)比較出現(xiàn)錯誤,郁悶了半天,網(wǎng)上查了資料才發(fā)現(xiàn)浮點(diǎn)數(shù)直接用雙目運(yùn)算符連接會出現(xiàn)結(jié)果不準(zhǔn)確問題。解決方法如下:
1。所有浮點(diǎn)運(yùn)算都在數(shù)據(jù)庫內(nèi)做好,也就是都用sql實(shí)現(xiàn)了
2。用BigDecimal實(shí)現(xiàn),方法如下(僅僅是個例子):
import java.math.BigDecimal;
public class tt {
/**
* @param args
*/
public static void main(String[] args) {
float a = 1.1f;
float b = 2.2f;
tt t = new tt();
System.out.println(t.add(a,b));
System.out.println(t.sub(a,b));
System.out.println(t.mul(a,b));
System.out.println(t.div(a,b));
System.out.println(t.round(a));
}
public float add(float v1,float v2){//加法
BigDecimal b1 = new BigDecimal(Float.toString(v1));
BigDecimal b2 = new BigDecimal(Float.toString(v2));
return b1.add(b2).floatValue();
}
public float sub(float v1,float v2){//減法
BigDecimal b1 = new BigDecimal(Float.toString(v1));
BigDecimal b2 = new BigDecimal(Float.toString(v2));
return b1.subtract(b2).floatValue();
}
public float mul(float v1,float v2){//乘法
BigDecimal b1 = new BigDecimal(Float.toString(v1));
BigDecimal b2 = new BigDecimal(Float.toString(v2));
return b1.multiply(b2).floatValue();
}
public float div(float v1,float v2){//除法
BigDecimal b1 = new BigDecimal(Float.toString(v1));
BigDecimal b2 = new BigDecimal(Float.toString(v2));
return b1.divide(b2,3,BigDecimal.ROUND_HALF_UP).floatValue();
}
public float round(float v){//截取3位
BigDecimal b = new BigDecimal(Float.toString(v));
BigDecimal one = new BigDecimal("1");
return b.divide(one,3,BigDecimal.ROUND_HALF_UP).floatValue();
}
}
# re: java浮點(diǎn)數(shù)運(yùn)算不準(zhǔn)確問題的解決 2006-02-07 11:51 avant 回復(fù) 更多評論
二進(jìn)制無法精確表達(dá)一些十進(jìn)制浮點(diǎn)數(shù)造成的,《java解惑》第2個謎題就是對此的精到解釋。