如何提取double / BigDecimal的小数位数

时间:2012-07-15 20:58:46

标签: java

假设我们有12345.6789的双倍值(应该是动态的)

现在要求将数字拆分并得到小数位和小数位,即:

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

我得到了小数部分,但是你可以在小数部分给出一个提示吗?非常感谢。

4 个答案:

答案 0 :(得分:26)

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]);

但是,正如我所说,这不是最有效和最干净的解决方案。

答案 1 :(得分:7)

你无法以确切的方式做你想做的事。

一个问题是,如果您的号码为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.

另一个问题是double类型不能完全代表12345.6789。它存储的数字略有不同。这称为表示错误。所以小数部分实际上不是6789。相反,你可以将它四舍五入到一些小数位。

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

答案 2 :(得分: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();

答案 3 :(得分:1)

您可以转换为String,找到小数点,获取子字符串,然后转换回整数。

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