2010-12-13 2 views
2

Как получить десятичную точку числа? Например:
Если у меня есть 1.5, как получить номер 5?Получить десятичную точку

+0

К сожалению, я не понимаю вопрос. Какие типы вы хотите обрабатывать? У вас есть двойной, и вы хотели бы десятичное представление после запятой в int? Вы хотели бы иметь 5 сохраненных в int? Почему 5, а не 50? – Benoit

+0

@Benoit, потому что меня интересует только первая цифра после точки. –

+0

... Зачем вам нужна «первая цифра после точки», но больше ничего? –

ответ

4
int result = static_cast<int>(fmod(number, 1)*10); 

EDIT: или проще и, вероятно, быстрее:

int result = static_cast<int>(number*10)%10; 

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

int result = abs(static_cast<int>(number*10))%10; 
+0

вы избили меня вовремя;) – BlackBear

+0

Что делать, если мы не знаем положения десятичной точки, я имею в виду, как решить эту проблему вообще для любого заданного числа с плавающей запятой, например, 12.76, 164.7, 8759.128756 и т. Д.? – Rasoul

+0

@Rasoul: Решение работает в любой ситуации, оно всегда дает вам первую десятичную цифру. –

2

Скажем, у вас есть x=234.537

floor(x*10) дает вам 2345

вы тогда просто нужно, чтобы получить остаток от деления на 10

Итак:

int firstDecimal = floor(x*10)%10

+1

'int firstDecimal = floor (x * 10)% 10' даже не компилируется. 'floor' имеет тип с плавающей точкой, но'% 'требует не-float (int, unsigned и т. д.). –

+0

Я не давал ответа на конкретный язык. Это можно использовать практически на любом языке. Возможно, вам понадобится листинг на C++. – nico

1

Здесь:

(int) (n*10) % 10 
+0

Что делать, если n отрицательно? Будет ли это работать? – Nawaz

+0

@ Наваз: Может или не может. Зависит от платформы (аппаратного обеспечения). –

+0

Я тоже думал! – Nawaz

1

Существует хороший простой способ сделать это.

int GetFirstDecimalPlace(float f) 
{ 
    const float dp = f - floorf(f); // This simply gives all the values after the 
             // decimal point. 
    return static_cast<int>(dp * 10.0f); // This move the value after the decimal 
              // point to before it and then casts to an 
              // int losing all other decimal places. 
} 
1

Путь работать с отрицательными числами с использованием не макро/вызовы функций:

n < 0 ? (int) (-n * 10) % 10 : (int) (n * 10) % 10 
+0

Слишком сложно. Может быть 'static_cast ((n> = 0? N: -n) * 10)% 10'. Но я не вижу причин, почему бы не назвать abs(). –

+0

Вы правы, так проще. И нет причин не для всех абс(), кроме, может быть, по соображениям производительности, но это ничтожно. Я просто хотел показать способ сделать это, используя инструменты, предоставляемые языком, а не библиотекой. Любая причина использовать static_cast вместо просто (int), кстати? –

+0

Благодарим вас за ответ. Причиной использования static_int вместо just (int) является отметка мест в программе, в которых выполняются явные приведения. Это делается для удобства чтения. –

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