Java 科學計數法
1 科學計數法的概念
1.1 有效數字
在一個近似數中,從左邊第一個不是0的數字起,到精確到的位數止,這中間的所有數字都叫做這個近似數的有效數字
例如:
890314000保留三位有效數字為8.90×10的8次方 (四舍)
839960000保留三位有效數字為8.40×10的8次方 (五入)
0.00934593保留三位有效數字為9.35×10的-3次方
1.2 E記號
大多數計算器及計算機程序用科學記數法顯示非常大和非常小的結果。因為指數上標(例如1011)在屏幕上顯示不方便,字母E或e通常是用來代表的十次冪(寫作“×10b”),E或e之后的數字是它的指數;換句話說,任何兩實數a和b(b應為整數),“aEb”所表示的值是a × 10b。注意,這種用法中字母e不是數學常數e,也不是指數函數exp()(采用用大寫字母E顯示可以更大程度地避免誤解);盡管它也表示指數,但這個符號通常被稱為(科學計數法)E或e符號,而不是指數中的底數符號(盡管后者也會出現)。在正式的出版物中盡量不要使用這種顯示方法。
注意科學記數法中的e或E與數學常數e或函數exp沒有關系。
這種寫法是因為一些計算機程序中不方便寫上標而產生的,在正式出版物中不應當使用這種寫法。
我國國家標准中科學計數法均用a ×10b的形式表示,而不是aEb(參見GB3101-1993,GBT15835-2011,GBT8170-2008)。
2 Java中的科學計數法
在Java中,當Double的取值符合某條件時,將會以科學計數法的方式顯示(下面是個人測試的結果,非從文檔中得到的結論):
@Test
public void testPrintScientificNotation() {
//整數部分位數大於等於8時開始以科學計數法顯示
System.out.println(-12345678.0);
System.out.println(12345678.0);
//整數位為0,當小數位以0開始連續出現大於等於3時開始以科學計數法顯示
System.out.println(0.0001);
System.out.println(-0.0001);
}
結果
-1.2345678E7
1.2345678E7
1.0E-4
-1.0E-4
很多時候,我們需要做一個統一,要么全部以科學計數法輸出,要么就全部顯示為普通計數。
根據網上的資料,主要提及NumberFormat、DecimalFormat、BigDecimal這三種API實現方式。
2.1 NumberFormat
NumberFormat 是所有數值格式的抽象基類。
public static String scientificNotation2String(Double d, int newValue) {
String value = null;
NumberFormat nf = NumberFormat.getInstance();
// 設置此格式中不使用分組
nf.setGroupingUsed(false);
// 設置數的小數部分所允許的最大位數。
nf.setMaximumFractionDigits(newValue);
value = nf.format(d);
return value;
}
如果輸入的小數位數,大於設定的最大的小數位數,則會進行四舍五入。
2.2 DecimalFormat
DecimalFormat 是 NumberFormat 的一個具體子類,用於格式化十進制數字。該類設計有各種功能,使其能夠解析和格式化任意語言環境中的數,包括對西方語言、阿拉伯語和印度語數字的支持。它還支持不同類型的數,包括整數 (123)、定點數 (123.4)、科學記數法表示的數 (1.23E4)、百分數 (12%) 和金額 ($123)。所有這些內容都可以本地化。
public static String scientificNotation2String(Double d) {
String value = null;
DecimalFormat decimalFormat = new DecimalFormat("0.00");//格式化設置
value = decimalFormat.format(d);
return value;
}
需要設置模版,指定小數保留的位數,傳入數值小數位數超出指定位數,則會進行四舍五入;傳入數值小數位不足指定位數,則可以設置補零。
需要將數值轉換為科學計數法只須將模版修改即可,例如將模版修改為:0.##E0
2.3 BigDecimal
BigDecimal是不可變的、任意精度的有符號十進制數。
public static String scientificNotation2String(String str) {
String value = null;
BigDecimal bd = new BigDecimal(str);
value = bd.toPlainString();
return value;
}
BigDecimal的構造方法很多,不一定是要傳入String類型的值。
BigDecimal中的toString方法和toPlanString方法的區別:
- toString():返回此BigDecimal的字符串表示形式,如果需要指數,則使用科學計數法
- toPlainString():返回不帶指數字段的此BigDecimal的字符傳表示形式
參考
- 互動百科:科學計數法:http://www.baike.com/wiki/科學計數法
- 博客:Java設置大數非科學計數法顯示:http://blog.csdn.net/yangfeisc/article/details/42639075
- 博客:如何使java中double類型不以科學計數法表示:http://vincentboy.iteye.com/blog/1647187
- JDK API 1.6.0 中文版
作者信息
湛耀 軟件工程師
博客園:http://www.cnblogs.com/zhanyao/
郵箱:xzhanyao@foxmail.com
歡迎指出不足,大家共同提高