Как извлечь дробные цифры double/BigDecimal
Скажем, мы имеем двойное значение 12345.6789
(должно быть динамическим)
Теперь требование разбивает число и получает десятичные цифры и дробные цифры, которые будут:
double number = 12345.6789;
int decimal = 12345;
int fractional = 6789;
Я получаю десятичную часть, но не могли бы вы дать подсказку о дробной части? Большое спасибо.
Ответы
Ответ 1
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]);
Но, как я уже сказал, это не самое эффективное и чистое решение.
Ответ 2
Вы не можете делать то, что хотите делать точным способом.
Одна проблема заключается в том, что у вас есть номер 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);
Ответ 3
Вы можете преобразовать в String
, найти десятичную точку, получить подстроку, а затем преобразовать обратно в Integer.
String numberStr = Double.toString(number);
String fractionalStr = numberStr.substring(numberStr.indexOf('.')+1);
int fractional = Integer.valueOf(fractionalStr);
Ответ 4
Вы должны решить, сколько десятичных знаков для поддержки. Я использую этот метод:
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();