Java中Double保留后小數(shù)位的幾種方法
返回double型的
1.能四舍五入
double d = 114.145;
d = (double) Math.round(d * 100) / 100;
System.out.println(d)
- BigDecimal.ROUND_HALF_UP表示四舍五入秽晚,BigDecimal.ROUND_HALF_DOWN也是五舍六入荞下,BigDecimal.ROUND_UP表示進(jìn)位處理(就是直接加1),BigDecimal.ROUND_DOWN表示直接去掉尾數(shù)乘陪。
double d = 114.145;
BigDecimal b = new BigDecimal(d);
d = b.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
System.out.println(d);
返回String型的
1.#.00表示保留后兩位,它的處理方式是直接截掉不要的尾數(shù),不四舍五入泽铛。
double d = 114.145;
DecimalFormat df = new DecimalFormat("#.00");
String str = df.format(d);
System.out.println(str);
2.%.2f表示保留后兩位,能四舍五入辑鲤。
double d = 114.145;
String.format("%.2f", d);
3.RoundingMode.HALF_DOWN表示 五舍六入盔腔,負(fù)數(shù)先取絕對(duì)值再五舍六入再負(fù)數(shù),RoundingMode.HALF_UP:表示四舍五入月褥,負(fù)數(shù)先取絕對(duì)值再五舍六入再負(fù)數(shù)弛随。
double d = 114.145
NumberFormat nf = NumberFormat.getNumberInstance(); // 保留兩位小數(shù)
nf.setMaximumFractionDigits(2); // 如果不需要四舍五入,可以使用RoundingMode.DOWN
nf.setRoundingMode(RoundingMode.UP);
System.out.println(nf.format(d));
Java中double類型的運(yùn)算
BigDecimal
在《Effective Java》這本書(shū)中也提到這個(gè)原則宁赤,float和double只能用來(lái)做科學(xué)計(jì)算或者是工程計(jì)算舀透,在商業(yè)計(jì)算中我們要用 java.math.BigDecimal。原則是使用BigDecimal并且一定要用String來(lái)夠造决左。
import java.math.BigDecimal;
/**
* 由于Java的簡(jiǎn)單類型不能夠精確的對(duì)浮點(diǎn)數(shù)進(jìn)行運(yùn)算愕够,這個(gè)工具類提供精
* 確的浮點(diǎn)數(shù)運(yùn)算走贪,包括加減乘除和四舍五入。
*/
public class Arith{
//默認(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();
}
};