Как получить часть после десятичной точки в Java?

У меня double переменная d = 1.15.

Я хочу число после десятичной точки, то есть "15".

Каков наилучший способ достичь этого в Java?

Я пытался так:

Double d = 1.15;
String str = d.toString();
int len = str.substring(str.indexOf(".")).length() - 1;
int i= (int) (d * (long)Math.pow(10,len) % (long)Math.pow(10,len));

Но я не получил правильный ответ, потому что когда я конвертирую d.toString() ответ будет 14.999999999999986.

Ответ 1

попробуй это,

String numberD = String.valueOf(d);
        numberD = numberD.substring ( numberD.indexOf ( "." ) );

Теперь эта переменная numberD будет иметь значение 15

Ответ 2

Попробуйте Math.floor();

double d = 4.24;
System.out.println( d - Math.floor( d )); 

Чтобы избежать ошибок округления, вы можете преобразовать их в BigDecimal

    double d = 4.24;
    BigDecimal bd = new BigDecimal( d - Math.floor( d ));
    bd = bd.setScale(4,RoundingMode.HALF_DOWN);
    System.out.println( bd.toString() );

Печать 0.2400

Обратите внимание, что 4 в setScale - это число цифр после разделителя десятичных чисел ('.')

Чтобы сохранить остаток в виде целочисленного значения, вы можете изменить его на

BigDecimal bd = new BigDecimal(( d - Math.floor( d )) * 100 );
bd = bd.setScale(4,RoundingMode.HALF_DOWN);
System.out.println( bd.intValue() );

Отпечатки 24

Ответ 3

Число после десятичной точки не является четко определенным понятием. Например, для "4.24" это может быть "0,24", "0,239999999999" (или аналогичный), "24" или "239999999999".

Вам нужно быть ясным, если вы говорите о числе или строке десятичных цифр... и является ли входное значение представлением двоичного числа с плавающей запятой (в этом случае "4.24", скорее всего, является приближением ) десятичное число с плавающей запятой.

В зависимости от вашей интерпретации правильный ответ будет другим.


Но я не получил правильного ответа, потому что когда я преобразовал d.toString(), ответ будет равен 14.999999999999986.

Вы столкнулись с проблемой, что double и float являются форматами с плавающей запятой base-2, и в большинстве случаев они не могут точно представлять десятичные числа с плавающей запятой. Для этого нет никаких оснований... помимо использования чего-то типа BigDecimal для представления ваших чисел. (И даже тогда некоторая потеря точности возможна всякий раз, когда вы выполняете операцию деления или по модулю.)

Ответ 4

Если ваш двойник:

d = 1.25;

И если вы это сделаете:

String number = String.valueOf(d);

number = number.substring(number.indexOf(".")).substring(1);

то number будет 25.

Я не знаю, лучший ли это для этого, но он работает.

Ответ 5

Если вы хотите десятичные разряды и хотите округлить результат.

double d = 4.24;
System.out.printf("%0.2f%n", d - (long) d);

печатает

0.24

Если вы хотите округленное значение, вы должны определить, какую точность вы хотите.

double d = 4.24;
double fract = d - (long) d;
fract = (long) (fract * 1e9 + 0.5) / 1e9; // round to the 9 decimal places.

Ответ 6

Попробуйте RegEx, здесь ^\d*\. , будет искать цифры, за которыми следует точка, и заменить на пустое.

for(double d : new double[]{1.15,0.009,222.9,3.67434}){
    System.out.println(String.valueOf(d).replaceAll("^\\d*\\.",""));
}

дает:

15
009
9
67434

Ответ 7

Как и на любом другом языке: умножьте на 10 и проверьте внутреннюю часть остатка при делении на 10. Точно так же вы извлечете цифры из целого числа.


short[] digits = new short[max_len];
double tmp = d - ((int) d);
for (int i = 0; i < digits.length && tmp != 0; i++)
{
  tmp *= 10;
  digit[i] = (short) tmp;
  tmp -= (int) tmp;
}

Но помните, что для double вам нужно ввести предел точности - максимальное количество цифр для извлечения (max_len из примера кода выше).

Небольшое обновление (добавление округления на границе точности):

double d = 1.15;
        short[] digits = new short[10];
        double tmp = d - ((int) d) + 0.5 * 1e-10;
        for (int i = 0; i < digits.length && tmp != 0; i++)
        {
            tmp *= 10;
            digits[i] = (short) tmp;
            tmp -= (int) tmp;
        }

Ответ 8

Вы пробовали d = d%1.0? Это должно вернуть остаток деления d на 1, который должен быть просто десятичной частью.

Вы также можете сделать это, чтобы получить значение как int: d = (int)((d%1.0)*100)

Ответ 9

Вместо d.toString() попробуйте следующее:

String str = String.format("%.2f", d);

Ответ 10

попробуй это:

double d = 1.1512;

int i = (int) (d*100 - Math.floor(d)*100);

Теперь это даст вам: 15

Ответ 11

    ExAMPLE :

    Double d = 469.951479;

    String string = d.toString();

    char[] len = string.substring(string.indexOf(".")).toCharArray();

    System.out.println(len);