2012-07-15 21 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();