1 科學計數(shù)法的概念
1.1 有效數(shù)字
在一個近似數(shù)中,從左邊第一個不是0的數(shù)字起,到精確到的位數(shù)止,這中間的所有數(shù)字都叫做這個近似數(shù)的有效數(shù)字
例如:
890314000保留三位有效數(shù)字為8.90×10的8次方 (四舍)
839960000保留三位有效數(shù)字為8.40×10的8次方 (五入)
0.00934593保留三位有效數(shù)字為9.35×10的-3次方
1.2 E記號
大多數(shù)計算器及計算機程序用科學記數(shù)法顯示非常大和非常小的結果。因為指數(shù)上標(例如1011)在屏幕上顯示不方便,字母E或e通常是用來代表的十次冪(寫作“×10b”),E或e之后的數(shù)字是它的指數(shù);換句話說,任何兩實數(shù)a和b(b應為整數(shù)),“aEb”所表示的值是a × 10b。注意,這種用法中字母e不是數(shù)學常數(shù)e,也不是指數(shù)函數(shù)exp()(采用用大寫字母E顯示可以更大程度地避免誤解);盡管它也表示指數(shù),但這個符號通常被稱為(科學計數(shù)法)E或e符號,而不是指數(shù)中的底數(shù)符號(盡管后者也會出現(xiàn))。在正式的出版物中盡量不要使用這種顯示方法。
注意科學記數(shù)法中的e或E與數(shù)學常數(shù)e或函數(shù)exp沒有關系。
這種寫法是因為一些計算機程序中不方便寫上標而產(chǎn)生的,在正式出版物中不應當使用這種寫法。
我國國家標準中科學計數(shù)法均用a ×10b的形式表示,而不是aEb(參見GB3101-1993,GBT15835-2011,GBT8170-2008)。
2 Java中的科學計數(shù)法
在Java中,當Double的取值符合某條件時,將會以科學計數(shù)法的方式顯示(下面是個人測試的結果,非從文檔中得到的結論):
@Test
publicvoidtestPrintScientificNotation(){
//整數(shù)部分位數(shù)大于等于8時開始以科學計數(shù)法顯示
System.out.println(-12345678.0);
System.out.println(12345678.0);
//整數(shù)位為0,當小數(shù)位以0開始連續(xù)出現(xiàn)大于等于3時開始以科學計數(shù)法顯示
System.out.println(0.0001);
System.out.println(-0.0001);
}
結果
-1.2345678E7
1.2345678E7
1.0E-4
-1.0E-4
很多時候,我們需要做一個統(tǒng)一,要么全部以科學計數(shù)法輸出,要么就全部顯示為普通計數(shù)。
根據(jù)網(wǎng)上的資料,主要提及NumberFormat、DecimalFormat、BigDecimal這三種API實現(xiàn)方式。
2.1 NumberFormat
NumberFormat 是所有數(shù)值格式的抽象基類。
publicstaticStringscientificNotation2String(Doubled,intnewValue){
Stringvalue=null;
NumberFormatnf=NumberFormat.getInstance();
// 設置此格式中不使用分組
nf.setGroupingUsed(false);
// 設置數(shù)的小數(shù)部分所允許的最大位數(shù)。
nf.setMaximumFractionDigits(newValue);
value=nf.format(d);
returnvalue;
}
如果輸入的小數(shù)位數(shù),大于設定的最大的小數(shù)位數(shù),則會進行四舍五入。
2.2 DecimalFormat
DecimalFormat 是 NumberFormat 的一個具體子類,用于格式化十進制數(shù)字。該類設計有各種功能,使其能夠解析和格式化任意語言環(huán)境中的數(shù),包括對西方語言、阿拉伯語和印度語數(shù)字的支持。它還支持不同類型的數(shù),包括整數(shù) (123)、定點數(shù) (123.4)、科學記數(shù)法表示的數(shù) (1.23E4)、百分數(shù) (12%) 和金額 ($123)。所有這些內(nèi)容都可以本地化。
publicstaticStringscientificNotation2String(Doubled){
Stringvalue=null;
DecimalFormatdecimalFormat=newDecimalFormat("0.00");//格式化設置
value=decimalFormat.format(d);
returnvalue;
}
需要設置模版,指定小數(shù)保留的位數(shù),傳入數(shù)值小數(shù)位數(shù)超出指定位數(shù),則會進行四舍五入;傳入數(shù)值小數(shù)位不足指定位數(shù),則可以設置補零。
需要將數(shù)值轉換為科學計數(shù)法只須將模版修改即可,例如將模版修改為:0.##E0
2.3 BigDecimal
BigDecimal是不可變的、任意精度的有符號十進制數(shù)。
publicstaticStringscientificNotation2String(Stringstr){
Stringvalue=null;
BigDecimalbd=newBigDecimal(str);
value=bd.toPlainString();
returnvalue;
}
BigDecimal的構造方法很多,不一定是要傳入String類型的值。
BigDecimal中的toString方法和toPlanString方法的區(qū)別:
toString():返回此BigDecimal的字符串表示形式,如果需要指數(shù),則使用科學計數(shù)法
toPlainString():返回不帶指數(shù)字段的此BigDecimal的字符傳表示形式
歡迎加入技術QQ群:364595326