Ответ 1
попробуй это,
String numberD = String.valueOf(d);
numberD = numberD.substring ( numberD.indexOf ( "." ) );
Теперь эта переменная numberD будет иметь значение 15
У меня 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
.
попробуй это,
String numberD = String.valueOf(d);
numberD = numberD.substring ( numberD.indexOf ( "." ) );
Теперь эта переменная numberD будет иметь значение 15
Попробуйте 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
Число после десятичной точки не является четко определенным понятием. Например, для "4.24" это может быть "0,24", "0,239999999999" (или аналогичный), "24" или "239999999999".
Вам нужно быть ясным, если вы говорите о числе или строке десятичных цифр... и является ли входное значение представлением двоичного числа с плавающей запятой (в этом случае "4.24", скорее всего, является приближением ) десятичное число с плавающей запятой.
В зависимости от вашей интерпретации правильный ответ будет другим.
Но я не получил правильного ответа, потому что когда я преобразовал d.toString(), ответ будет равен 14.999999999999986.
Вы столкнулись с проблемой, что double
и float
являются форматами с плавающей запятой base-2, и в большинстве случаев они не могут точно представлять десятичные числа с плавающей запятой. Для этого нет никаких оснований... помимо использования чего-то типа BigDecimal
для представления ваших чисел. (И даже тогда некоторая потеря точности возможна всякий раз, когда вы выполняете операцию деления или по модулю.)
Если ваш двойник:
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.
Попробуйте 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
Как и на любом другом языке: умножьте на 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;
}
Вы пробовали d = d%1.0
? Это должно вернуть остаток деления d на 1, который должен быть просто десятичной частью.
Вы также можете сделать это, чтобы получить значение как int: d = (int)((d%1.0)*100)
Вместо d.toString()
попробуйте следующее:
String str = String.format("%.2f", d);
попробуй это:
double d = 1.1512;
int i = (int) (d*100 - Math.floor(d)*100);
Теперь это даст вам: 15
ExAMPLE :
Double d = 469.951479;
String string = d.toString();
char[] len = string.substring(string.indexOf(".")).toCharArray();
System.out.println(len);