假设我们有一个双重值12345.6789
(应该是动态的)
现在的要求是拆分数字并获得小数位和小数位,这将是:
double number = 12345.6789;
int decimal = 12345;
int fractional = 6789;
我得到了小数部分,但你能提示一下小数部分吗?非常感谢。
假设我们有一个双重值12345.6789
(应该是动态的)
现在的要求是拆分数字并获得小数位和小数位,这将是:
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]);
但是,正如我所说,这不是最有效和最干净的解决方案。
你不能以一种确切的方式做你想做的事。
一个问题是,如果你有数字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);
您必须决定支持多少小数。我使用这种方法:
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();
您可以转换为String
,找到小数点,获取子字符串,然后再转换回整数。
String numberStr = Double.toString(number);
String fractionalStr = numberStr.substring(numberStr.indexOf('.')+1);
int fractional = Integer.valueOf(fractionalStr);