2012-01-17 2 views
8

У меня есть переменная doubled = 1.15.Java: как получить часть после десятичной точки?

Я хочу число после десятичной точки, то есть «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.

Пожалуйста, помогите. Благодарю.

+0

http://stackoverflow.com/questions/5017072/how-to-get-the-decimal-part-of-a-float – John

+1

Этот вопрос был информативным для меня - я узнал, фактически запустите код, который они публикуют, или действительно прочитали вопрос. Вопрос в том, как получить '15' с' 1.15'. Только Арджун прибил его до сих пор, потому что он видел эту проблему для того, что она на самом деле: вопрос о синтаксическом анализе. Просто потому, что плакат, пробовавший использовать математику, не означает, что ответ должен следовать по тому же пути. – Paul

+0

@Paul - Я бы сказал, что последний (отрицательный) пример OP дает ложь этой теории. Если это была просто проблема синтаксического анализа, тогда OP был бы доволен «999999999986» в качестве ответа ... –

ответ

0

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

Но следует помнить, что для удвоит вам нужно ввести предел точности - максимальное количество цифр для извлечения (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; 
     }
+0

-1 Вау, не только ваш код не работает, это слишком сложно для вопроса.Я запустил ваш код и массив содержал 1 и 4 для входного значения 1,15. – Paul

+0

Фактически результат 1 4 9 9 9 9 9 9 9 9 ... Так оно и есть с удвоениями - вы не можете точно сказать, сколько цифр оно имеет после точки из-за неточности их арифметики. И если вы получили этот двойник от некоторого выражения (не явно определяя его значение), убедитесь, что он имеет неточность в нем. Вот почему я рассказал о прецизионном пределе. Стивен С дал хорошее объяснение этому выше. –

+0

Я запустил ваш код и получил массив из 2, содержащий 1 и 4. Я установил 'max_len' в 2, так как ему нужен 2-символьный ответ:' 15'. Он не пытается заниматься математикой - он просто хочет получить текст. – Paul

0

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

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

+0

Не думайте, что это работает для чисел с плавающей запятой. –

+2

Я тоже не был уверен, что это произошло, но, прочитав это, я уверен, что это так, если я не ошибаюсь. http://stackoverflow.com/questions/2947044/how-do-i-use-modulus-for-float-double – aoi222

+0

Вау, это действительно интересная функция. Хорошо, теперь я знаю об этом. Благодарю. –

11

попробовать это,

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

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

+1

+1, это просто и ответ не обязательно должен быть математическим. Рассмотрение этой проблемы как проблемы с строкой устраняет проблемы с точностью. Хорошая работа. – Paul

+0

Это неверно. Вы получите десятичное значение, а также часть результата. Не уверен, почему это было прочитано читателями, даже не пытаясь. Ответ Питера верен. Вам понадобится другая .substring (1) в конце. – rajneesh2k10

+0

Нет, он не будет, он вернет значение '.24'. Измените 'numberD.indexOf ('.') + 1', чтобы получить' 24'. –

8

Try 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

+1

Я запустил ваш код и получил '0.2400000000000002' - я не думаю, что он найдет это полезным. Все, что реп, и вы не можете проверить свой код? : D – Paul

+3

@Paul, своя ошибка округления, вы должны были услышать о них. –

+0

@Paul Спасибо, исправлено это, это представление IEEE 754, которое ему просто нужно округлить. – stacker

5

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

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

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


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

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

0

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

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. 
0

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

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

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

d = 1.25; 

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

String number = String.valueOf(d); 

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

тогда number будет 25.

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

Смежные вопросы