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