1 科學(xué)計(jì)數(shù)法的概念
1.1 有效數(shù)字
在一個(gè)近似數(shù)中,從左邊第一個(gè)不是0的數(shù)字起舌胶,到精確到的位數(shù)止,這中間的所有數(shù)字都叫做這個(gè)近似數(shù)的有效數(shù)字
例如:
890314000保留三位有效數(shù)字為8.90×10的8次方 (四舍)
839960000保留三位有效數(shù)字為8.40×10的8次方 (五入)
0.00934593保留三位有效數(shù)字為9.35×10的-3次方
1.2 E記號(hào)
大多數(shù)計(jì)算器及計(jì)算機(jī)程序用科學(xué)記數(shù)法顯示非常大和非常小的結(jié)果。因?yàn)橹笖?shù)上標(biāo)(例如1011)在屏幕上顯示不方便纵势,字母E或e通常是用來代表的十次冪(寫作“×10b”),E或e之后的數(shù)字是它的指數(shù)管钳;換句話說钦铁,任何兩實(shí)數(shù)a和b(b應(yīng)為整數(shù)),“aEb”所表示的值是a × 10b才漆。注意牛曹,這種用法中字母e不是數(shù)學(xué)常數(shù)e,也不是指數(shù)函數(shù)exp()(采用用大寫字母E顯示可以更大程度地避免誤解)醇滥;盡管它也表示指數(shù)黎比,但這個(gè)符號(hào)通常被稱為(科學(xué)計(jì)數(shù)法)E或e符號(hào),而不是指數(shù)中的底數(shù)符號(hào)(盡管后者也會(huì)出現(xiàn))鸳玩。在正式的出版物中盡量不要使用這種顯示方法阅虫。
注意科學(xué)記數(shù)法中的e或E與數(shù)學(xué)常數(shù)e或函數(shù)exp沒有關(guān)系。
這種寫法是因?yàn)橐恍┯?jì)算機(jī)程序中不方便寫上標(biāo)而產(chǎn)生的不跟,在正式出版物中不應(yīng)當(dāng)使用這種寫法颓帝。
我國國家標(biāo)準(zhǔn)中科學(xué)計(jì)數(shù)法均用a ×10b的形式表示,而不是aEb(參見GB3101-1993,GBT15835-2011购城,GBT8170-2008)吕座。
2 Java中的科學(xué)計(jì)數(shù)法
在Java中,當(dāng)Double的取值符合某條件時(shí)瘪板,將會(huì)以科學(xué)計(jì)數(shù)法的方式顯示(下面是個(gè)人測試的結(jié)果米诉,非從文檔中得到的結(jié)論):
@Test
publicvoidtestPrintScientificNotation(){
//整數(shù)部分位數(shù)大于等于8時(shí)開始以科學(xué)計(jì)數(shù)法顯示
System.out.println(-12345678.0);
System.out.println(12345678.0);
//整數(shù)位為0,當(dāng)小數(shù)位以0開始連續(xù)出現(xiàn)大于等于3時(shí)開始以科學(xué)計(jì)數(shù)法顯示
System.out.println(0.0001);
System.out.println(-0.0001);
}
結(jié)果
-1.2345678E7
1.2345678E7
1.0E-4
-1.0E-4
很多時(shí)候,我們需要做一個(gè)統(tǒng)一篷帅,要么全部以科學(xué)計(jì)數(shù)法輸出史侣,要么就全部顯示為普通計(jì)數(shù)。
根據(jù)網(wǎng)上的資料魏身,主要提及NumberFormat惊橱、DecimalFormat、BigDecimal這三種API實(shí)現(xiàn)方式箭昵。
2.1 NumberFormat
NumberFormat 是所有數(shù)值格式的抽象基類税朴。
publicstaticStringscientificNotation2String(Doubled,intnewValue){
Stringvalue=null;
NumberFormatnf=NumberFormat.getInstance();
// 設(shè)置此格式中不使用分組
nf.setGroupingUsed(false);
// 設(shè)置數(shù)的小數(shù)部分所允許的最大位數(shù)。
nf.setMaximumFractionDigits(newValue);
value=nf.format(d);
returnvalue;
}
如果輸入的小數(shù)位數(shù)家制,大于設(shè)定的最大的小數(shù)位數(shù)正林,則會(huì)進(jìn)行四舍五入。
2.2 DecimalFormat
DecimalFormat 是 NumberFormat 的一個(gè)具體子類颤殴,用于格式化十進(jìn)制數(shù)字觅廓。該類設(shè)計(jì)有各種功能,使其能夠解析和格式化任意語言環(huán)境中的數(shù)涵但,包括對西方語言杈绸、阿拉伯語和印度語數(shù)字的支持。它還支持不同類型的數(shù)矮瘟,包括整數(shù) (123)瞳脓、定點(diǎn)數(shù) (123.4)、科學(xué)記數(shù)法表示的數(shù) (1.23E4)澈侠、百分?jǐn)?shù) (12%) 和金額 ($123)劫侧。所有這些內(nèi)容都可以本地化。
publicstaticStringscientificNotation2String(Doubled){
Stringvalue=null;
DecimalFormatdecimalFormat=newDecimalFormat("0.00");//格式化設(shè)置
value=decimalFormat.format(d);
returnvalue;
}
需要設(shè)置模版哨啃,指定小數(shù)保留的位數(shù)烧栋,傳入數(shù)值小數(shù)位數(shù)超出指定位數(shù),則會(huì)進(jìn)行四舍五入棘催;傳入數(shù)值小數(shù)位不足指定位數(shù)劲弦,則可以設(shè)置補(bǔ)零。
需要將數(shù)值轉(zhuǎn)換為科學(xué)計(jì)數(shù)法只須將模版修改即可醇坝,例如將模版修改為:0.##E0
2.3 BigDecimal
BigDecimal是不可變的邑跪、任意精度的有符號(hào)十進(jìn)制數(shù)次坡。
publicstaticStringscientificNotation2String(Stringstr){
Stringvalue=null;
BigDecimalbd=newBigDecimal(str);
value=bd.toPlainString();
returnvalue;
}
BigDecimal的構(gòu)造方法很多,不一定是要傳入String類型的值画畅。
BigDecimal中的toString方法和toPlanString方法的區(qū)別:
toString():返回此BigDecimal的字符串表示形式砸琅,如果需要指數(shù),則使用科學(xué)計(jì)數(shù)法
toPlainString():返回不帶指數(shù)字段的此BigDecimal的字符傳表示形式
歡迎加入技術(shù)QQ群:364595326