我正在開發一個化學應用程序,我需要包括阿伏加德羅常數: (602200000000000000000000
)數太大的BigInteger
我真的不知道我是否可以用科學記數法表示它6.022 x 10x23
(不能放指數)。
我第一次使用double
,然後long
現在,我用java.math.BigInteger
。
但它仍然說它太大了,我該怎麼做或應該這樣做對於一個系統來說很重要?
我正在開發一個化學應用程序,我需要包括阿伏加德羅常數: (602200000000000000000000
)數太大的BigInteger
我真的不知道我是否可以用科學記數法表示它6.022 x 10x23
(不能放指數)。
我第一次使用double
,然後long
現在,我用java.math.BigInteger
。
但它仍然說它太大了,我該怎麼做或應該這樣做對於一個系統來說很重要?
首先,你需要檢查你的物理/化學課本。
阿伏加德羅的號碼不是602,200,000,000,000,000,000,000。它是大約 6.022 x 10 。關鍵詞是「大約」。這個數字是一個經驗測量值。
(根據Wikipedia,目前最好的近似是6.022140857(74)×10 摩爾-1,相對誤差爲±1.2×10 -8 。)
由於該數字僅約爲8位十進制數字的精度,因此Java double
類型是一種適當的類型來表示它。因此,我會用
final double AVOGADROS_CONSTANT = 6.02214085774E23;
顯然,無論是int
或long
可以代表這個數字。 A float
可能但不夠精確(假設我們使用最佳可用測量值)。 BigInteger
是一種可能性,但它在概念上是錯誤的,因爲我們實際上並沒有一個確切的常量整數值。
現在您的與聲明的常數(不同)的double
,一個long
和BigInteger
明顯的問題。
我希望你做了這樣的事情:
double a = 602200000000000000000000;
等。這是行不通的,但它不起作用的原因需要解釋。問題在於該號碼是以文字形式提供的int
。一個int
不能那麼大。儘可能最大的int
值爲2 - 1 ...這比2 x 10大一點點。。
這就是Java編譯器所抱怨的。字面太大而不能成爲int
。
對於long
字面值也太大了。 (做數學)
但是它不是太大的文字double
......只要你寫得正確。
使用BigInteger(String)
的解決方案的工作原理是,它通過使用字符串代替數字字面值並在運行時解析數字文字來解決數字問題。從語言的角度來看沒什麼問題,但(IMO)錯了,因爲額外的精確度是一種錯覺。
將它作爲String
傳遞給BigInteger構造函數,它工作得很好。
BigInteger a = new BigInteger("602200000000000000000000");
a = a.multiply(new BigInteger("2"));
System.out.println(a);
輸出:1204400000000000000000000
謝謝,好像我的大部分程序將在字符串參數中定義。但爲什麼它可以表示爲一個字符串,但它不能作爲一個整數? –
@AntonioAguilar這是因爲當你嘗試將它傳遞給BigInteger構造函數,比如BigInteger a = new BigInteger(602200000000000000000000);那麼首先將該數字解析爲一個int。顯然,儘管它不適合int,但它肯定會適合BigInt。爲了規避這種情況,您將該數字作爲字符串傳遞。有關更多詳細信息,請參閱Dukeling的答案。 – Rishav
您可以使用E符號寫的科學記數法:
double a = 6.022e23;
的問題是你怎麼想創建它(最有可能),不因爲它不適合。
如果你只是一個數字的文字在你的代碼(即使你試圖將其分配到一個double
或long
)(被轉換爲需要的類型爲前),this is first treated as an integer,而且數量,你有可以」 t適合一個整數。
// Even though this number can fit into a long, it won't compile, because it's first treated
// as an integer.
long l = 1234567889;
要建立一個長期的,你可以添加L
到你的電話號碼,所以602200000000000000000000L
,雖然會不適合長期或者 - the max value is 263-1。
要創建雙,你可以添加.0
到你的電話號碼,所以602200000000000000000000.0
(或6.022e23
爲Guffa建議),但如果你想精確值,你不應該使用這個,因爲你可能會失去的,因爲它的方式一定的準確性存儲該值。
要創建BigInteger
,你可以使用the constructor taking a string parameter:
new BigInteger("602200000000000000000000");
如果BigInteger說的太大,則必須安裝更多的RAM。 – csmckelvey
問題可能不是BigInteger。該大小的整數可以用大約80位來表示。即使考慮到其他實現開銷,BigInteger也會支持這一點,沒有任何問題。問題可能是OP如何嘗試初始化。 – Peter
將來,不要說「它仍然說它太大」,只需複製粘貼您看到的確切錯誤消息即可。對我來說編譯器說'整數太大:602200000000000000000000'。 –