Как получить часть после десятичной точки в 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,

15 ответов

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

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

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

Попробуйте 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() );

Prints 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() );

Prints 24

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

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

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


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

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

Попробуйте 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

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

d = 1.25;

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

String number = String.valueOf(d);

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

затем number будет 25,

Я не знаю, является ли это лучшим способом сделать это, но это работает.

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

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.
        Scanner scr= new Scanner (System.in);
  double d= scr.nextDouble();

  BigDecimal bc= new BigDecimal ((d - Math.floor(d))*1e5); 

  bc=bc.setScale(4,RoundingMode.HALF_DOWN); 

  double f = bc.doubleValue();

    while(f%10==0)
    {
      f=f/10;
    }
  System.out.println(f);

Вместо d.toString(), попробуй это:

String str = String.format("%.2f", d);
    double d = 4.24;
    d = (d - Math.floor( d ));
    int e = (int)(Math.round(d*100));
    System.out.println(e);

Урожайность 24

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

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

Как и в любом другом языке: умножьте на 10 и проверьте часть int остатка при делении на 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;
        }

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

double d = 1.1512;

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

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

double myNumber = 1.15;
//numbers After Dot
double n = 2;
double right_of_dot = (myNumber - (int) myNumber)*Math.pow(10,n);
    ExAMPLE :

    Double d = 469.951479;

    String string = d.toString();

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

    System.out.println(len);

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

var decimalsOnly = (parseFloat(decNum)-parseInt(decNum,10)).toFoxed(2);
Другие вопросы по тегам