2012-08-11 41 views
3

我需要在Java中用一些完美的精度和小數點後的小數點數表示一些數字;在小數點後,我不在乎。 (更具體 - 金錢和百分比)在java中的快速性能的定點算術

我用Java的自己的BigDecimal現在,但我發現,它的真的慢,它開始在我的應用程序來顯示。所以我想用一個「常規」整數和一個定點算術(長整數對於我的目的來說有足夠大的精度)來解決它。

現在,我認爲我不是第一個遇到這種問題的人,並且已經有了一個庫,已經實現了乘法/除法 - 但事實似乎並非如此。

現在,我很可能自己寫(我可能會這樣做),但是真的,我真的是第一個需要這個的人嗎?那裏是不是已經有一些圖書館了?

+1

%100精度?這是不定式數字號碼 – 2012-08-11 18:03:51

+0

你想要的數字是什麼? – 2012-08-11 18:04:45

+0

對不起,100%需要比喻。我將添加更多信息。 – 2012-08-11 18:05:25

回答

4

你是完全肯定BigDecimal是性能問題?你是否使用探查器找出?如果是,有兩個選項可以幫助您:

1)使用long並將所有值乘以一個因子(例如,如果您對美分感興趣,則爲100)。

2)使用專門設計的類,實現類似於BigDecimal,但在內部使用long。我不知道是否存在一個好的開源庫(可能是Java Math Fixed Point Library?)。我很久以前(2001年我相信)爲J2ME編寫了一個這樣的課程。正確的做法有點棘手。請注意0​​內部也使用long,除非需要高精度,所以這種解決方案在大多數情況下只會有一點幫助。

在許多情況下使用double並不是一個好的選擇,因爲舍入和精度問題。

+0

+1所有問題都可以解決,舍入錯誤不是隨機錯誤,容易解決。 IHMO如果更簡單,我會使用'long',否則使用'double'和'BigDecimal'。 – 2012-08-11 19:04:42

+1

*使用專門設計的類來實現與BigDecimal類似的內容,但在內部使用long。*'BigDecimal'確實如此,除非膨脹(即「long」不夠)。 – bestsss 2012-08-11 19:22:02

+0

'BigDecimal'在內部不使用'long'。它使用'BigInteger',並在內部使用'int []'。這就是爲什麼'BigDecimal'比使用'long'慢一點。但是,在許多(大多數)情況下,性能差異太小而不重要。 – 2012-08-11 19:46:42

0

不知道爲什麼你需要一個庫。

例如,假設你要添加兩個多頭具有相同的固定精度

long c = a + b; 

假設您希望將多個固定精度其整數

long c = a * i; 

說你想要用一個整數除以一個數字舍入爲零

long c = a/i; 

假設你想打印一個具有3位小數的固定精確數字。

System.out.println(c/1e3); 

也許你在想這個問題,並假設你需要一切的庫。

如果您使用的是longdouble您可能需要少量輔助方法進行舍入,但您不需要庫。

+1

-1圖書館將是有用的,3小數位例如:1.234 * 1.234是1234 * 1234 = 1522756,你必須除以1000,否則你會得到1522.756而不是正確的1.522 – peenut 2013-03-22 08:20:24

+1

@Peenut這是如此微不足道的寫一個輔助類你的應用程序需要,但我從來沒有打擾過,也沒有見過它完成。不知道爲什麼-1。 – 2013-03-22 14:23:16

+1

讓我引用更好的答案:「正確的做法有點棘手。」 – peenut 2013-05-01 11:34:43

3

decimal4j是一個基於long的快速固定精度算法的Java庫,支持多達18位小數位。

聲明:我參與了decimal4j項目。