說的小數位,我們有12345.6789
雙值(應該是動態的)如何提取雙/ BigDecimal的
現在要求分割的數量和獲得的小數位數和小數位數,具體做法是:
double number = 12345.6789;
int decimal = 12345;
int fractional = 6789;
我得到了小數部分的工作,但可以請給小數部分提示嗎?非常感謝。
說的小數位,我們有12345.6789
雙值(應該是動態的)如何提取雙/ BigDecimal的
現在要求分割的數量和獲得的小數位數和小數位數,具體做法是:
double number = 12345.6789;
int decimal = 12345;
int fractional = 6789;
我得到了小數部分的工作,但可以請給小數部分提示嗎?非常感謝。
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]);
但是,正如我所說,這是不是最有效和最乾淨的解決方案。
它需要一個用於split方法的正則表達式字符串參數。所以你需要使用「\\」。 ref:http://stackoverflow.com/a/14833048/2000405 – 2015-09-03 08:37:48
你不能以確切的方式做你想做的事情。
一個問題是,如果您的號碼是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);
可以轉換爲String
,找出小數點,得到串,然後再轉換回整型。
String numberStr = Double.toString(number);
String fractionalStr = numberStr.substring(numberStr.indexOf('.')+1);
int fractional = Integer.valueOf(fractionalStr);
您必須決定支持多少個小數。我用這個方法:
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();
你需要決定,如果你正在尋找的*印刷*代表的小數部分,或者如果你願意接受的準確性看似懸殊的實際二進制表示。 – seh 2012-07-15 21:03:39
@seh有一個區別,即小數只能包含沒有穿孔的數字。 – Dreamer 2012-07-15 21:14:52
唯一的方法是設置小數的數量來處理...小數點後2位的示例:0.01爲1,0.10爲10.查看我的答案。 – marcolopes 2013-06-24 03:10:46