Как извлечь дробные цифры 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();