2012-07-15 74 views
10

說的小數位,我們有12345.6789雙值(應該是動態的)如何提取雙/ BigDecimal的

現在要求分割的數量和獲得的小數位數和小數位數,具體做法是:

double number = 12345.6789; 
int decimal = 12345; 
int fractional = 6789; 

我得到了小數部分的工作,但可以請給小數部分提示嗎?非常感謝。

+1

你需要決定,如果你正在尋找的*印刷*代表的小數部分,或者如果你願意接受的準確性看似懸殊的實際二進制表示。 – seh 2012-07-15 21:03:39

+0

@seh有一個區別,即小數只能包含沒有穿孔的數字。 – Dreamer 2012-07-15 21:14:52

+0

唯一的方法是設置小數的數量來處理...小數點後2位的示例:0.01爲1,0.10爲10.查看我的答案。 – marcolopes 2013-06-24 03:10:46

回答

13
double number = 12345.6789; // you have this 
int decimal = (int) number; // you have 12345 
double fractional = number - decimal // you have 0.6789 

這裏的問題是,小數部分沒有在內存中寫爲「0.6789」,但可能有一定的「補償」,可以這麼說。例如0.6789可以存儲爲0.67889999291293929991

我覺得這裏你的主要關注是不是越來越小數部分,但具有一定精度得到小數部分。

如果你想獲得你把它分配給精確值,你可能要考慮這個(本書雖然,它不是一個乾淨的解決方案):

String doubleAsText = "12345.6789"; 
double number = Double.parseDouble(doubleAsText); 
int decimal = Integer.parseInt(doubleAsText.split("\.")[0]); 
int fractional = Integer.parseInt(doubleAsText.split("\.")[1]); 

但是,正如我所說,這是不是最有效和最乾淨的解決方案。

+0

它需要一個用於split方法的正則表達式字符串參數。所以你需要使用「\\」。 ref:http://stackoverflow.com/a/14833048/2000405 – 2015-09-03 08:37:48

5

你不能以確切的方式做你想做的事情。

一個問題是,如果您的號碼是1.05結果應該如何?

double number = 1.05; 
int decimal = 1; 
int fractional = 5; // Oops! "1.05" and "1.5" give the same result. 

這個怎麼樣?

int fractional = 05; // Still not correct. This is an octal number. 

另一個問題是雙色型不能準確表示12345.6789。它存儲一個稍微不同的數字。這被稱爲表示錯誤。所以小數部分實際上不會是6789。相反,您可以將其舍入到小數位數。

int fractional = (int)Math.round((number - decimal) * 1000); 
+0

因爲小數部分可以有4位以上的數字,所以不會一直工作:) – GETah 2012-07-15 21:03:00

+0

@Mark Byers感謝您的解決方案,但是小數部分是動態的,所以我們不知道它有多長時間* 1000解決方案可能無法正常工作。如果double是12345.678,那麼它變成* 100。 – Dreamer 2012-07-15 21:18:56

+2

@Subarule:我沒有給你一個解決方案,我給你解釋了爲什麼不改變需求就無法完成。你願意改變哪個要求? – 2012-07-15 21:23:44

2

可以轉換爲String,找出小數點,得到串,然後再轉換回整型。

String numberStr = Double.toString(number); 
String fractionalStr = numberStr.substring(numberStr.indexOf('.')+1); 
int fractional = Integer.valueOf(fractionalStr); 
2

您必須決定支持多少個小數。我用這個方法:

int decimals = 2; 
BigDecimal value = new BigDecimal(123.45).setScale(decimals, RoundingMode.HALF_EVEN); 
BigInteger INTEGER = value.abs().toBigInteger(); 
//(value - INTEGER) * (10^decimais) 
BigInteger DECIMAL = ((value.subtract(new BigDecimal(INTEGER))).multiply(new BigDecimal(10).pow(decimals))).toBigInteger();