import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.text.NumberFormat;
/**
* java 保留小數點后N位數(若干位)位,幾種實現的方式總結
* (1)常用的是1.DecimalFormat,和2.BigDecimal
* (2)4.String .format("%.2f",dbstr);
* @author zhangqf
*
*/
public class BigDecimalDemo01 {
public static void main(String[] args) {
/**1.DecimalFormat**/
DecimalFormat decimalFormat=new DecimalFormat();
decimalFormat.applyPattern("############.###############");
//decimalFormat.applyPattern("#.00");//decimalFormat.applyPattern("###,###,###,###.###");
// #.00 表示兩位小數 #.0000四位小數 以此類推.
String df="0.000000520";
double d=Double.parseDouble(df);
String testdf=decimalFormat.format(d);
//切記:decimalFormat.format(d);格式里面放的是d是double類型的,不可把df字符串String放進去,
//寫代碼時不會報錯,但運行的時候會報:不合法參數異常
System.out.println("testdf:="+testdf);
/**1.1.DecimalFormat變形使用,當輸入數較大16位左右或小數位0超過5位以上例如:0.00000005,就會變成科學計數法的形式**/
String strdf1="12.0123";
String strdf2="0.000000005";
String strMul=mul(strdf1, strdf2);
System.out.println("strMul:="+strMul);
/*1.和1.1DecimalFormat運行結果
* 0.00000052----testdf
61.7283945617283945====strMul*/
/**2.BigDecimal,一般也用於java計算器加減乘除**/
double bdf=0.0078123456789;
BigDecimal bigDecimal=new BigDecimal(bdf);
double bdfScale=bigDecimal.setScale(10, BigDecimal.ROUND_HALF_UP).doubleValue();
/*double bdfScale=bigDecimal.setScale(10, BigDecimal.ROUND_HALF_UP).doubleValue();//四舍五入,保留2位小數
double bdf=0.000000078;--小數點后面的0不能多於5個,否則就是科學計數法-->運行結果:7.8E-8=====bdfScale
但是,0.0078123456789這種就不會變成科學計數法
*/
System.out.println("bdfScale:="+bdfScale);
/**3.NumberFormat,數字格式化---數字,貨幣,百分數,后續專門詳細寫這個模塊,
* 創建格式化器(默認地區Local格式):
NumberFormat.getNumberInstance();
NumberFormat.getCurrencyInstance();
NumberFormat.getPercentInstance();
* **/
Double dbNumberF=new Double("123456789.1236");
System.out.println("dbNumberF:="+dbNumberF);
NumberFormat numberFormat=java.text.NumberFormat.getInstance();
numberFormat.setGroupingUsed(false);//只保留了3位,也會四舍五入
String dbNumFstr=numberFormat.format(dbNumberF);
System.out.println("dbNumberF:"+dbNumFstr);
/* Double dbNumberF=new Double("123456789.123456789");
dbNumberF:=1.2345678912345679E8
dbNumberF:123456789.123*/
/**運行結果:
* dbNumberF:=1.234567891236E8
dbNumberF:123456789.124**/
/*3.1變式2
用NumberFormat的setMaximumFractionDigits方法實現
NumberFormat format=NumberFormat.getNumberInstance() ;
format.setMaximumFractionDigits(int digits) //digits為 顯示的數字位數
*/
double number = 23.5455;
NumberFormat format = NumberFormat.getNumberInstance() ;
format.setMaximumFractionDigits(2);
String result = format.format(number) ;
System.out.println("result:="+result);//23.55
/**4.String .format(),一般也用於java計算器加減乘除**/
double dbstr=3.14625789;
String resultStr = String .format("%.2f",dbstr);
/*這個小數格式化:位數不夠用0來補,也可四舍五入
String resultStr = String .format("%.2f",dbstr);
3.1462578900*/
System.out.println("resultStr:="+resultStr);
/**5.利用算法實現**/
double numberArith=0.562;//可以是int,也可以是double
/*對於這種類型是有精度丟失,不成立的;double numberArith=0.000000006;輸出結果:0.0*/
double resultArith = ((int) (numberArith * 100)) / 100.0;
System.out.println("resultArith:="+resultArith);
}
/**
* * 兩個Double數相乘 *
*
* @param v1
* *
* @param v2
* *
* @return String
*/
public static String mul(String v1, String v2) {
BigDecimal b1 = new BigDecimal(v1);
BigDecimal b2 = new BigDecimal(v2);
return numFormat(b1.multiply(b2).toString());
}
public static String numFormat(String resultFormat){//double d = 41.123;
String d = resultFormat;
if (d.contains(".")) {
String dot=d.substring(d.indexOf("."), d.length());
DecimalFormat df = new DecimalFormat("#.####################");
//不用指定整數位多少位,這樣比較好,以免數很大造成科學計數法
double db=Double.valueOf(dot);
String str=df.format(db);
str=d.substring(0, d.indexOf("."))+str.substring(1, str.length());
//System.out.println(str);
return str;
}
return d;
}
}
運行輸出結果:
testdf:=0.00000052
strMul:=6.0000000000615
bdfScale:=0.0078123457
dbNumberF:=1.234567891236E8
dbNumberF:123456789.124
result:=23.55
resultStr:=3.15
resultArith:=0.56