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

Dre*_*mer 15 java

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

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

double number = 12345.6789;
int decimal = 12345;
int fractional = 6789;
Run Code Online (Sandbox Code Playgroud)

我得到了小数部分,但是你能不能给出小数部分的提示?非常感谢.

ior*_*vic 28

double number = 12345.6789; // you have this
int decimal = (int) number; // you have 12345
double fractional = number - decimal // you have 0.6789
Run Code Online (Sandbox Code Playgroud)

这里的问题是小数部分不是在内存中写成"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]);
Run Code Online (Sandbox Code Playgroud)

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

  • 它需要一个用于split方法的regex String参数.所以你需要使用"\\." 参考:http://stackoverflow.com/a/14833048/2000405 (3认同)

Mar*_*ers 8

你不能以一种精确的方式做你想做的事.

一个问题是,如果你有数字1.05应该是什么结果?

double number = 1.05;
int decimal = 1;
int fractional = 5; // Oops! "1.05" and "1.5" give the same result.
Run Code Online (Sandbox Code Playgroud)

这个怎么样?

int fractional = 05; // Still not correct. This is an octal number.
Run Code Online (Sandbox Code Playgroud)

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

int fractional = (int)Math.round((number - decimal) * 1000);
Run Code Online (Sandbox Code Playgroud)

  • @Subarule:我没有给你一个解决方案,我给你解释了为什么不改变要求就无法完成.您愿意改变哪种要求? (3认同)