2016-12-17 7 views
0

Я хочу написать программу на C++ для Cin десятичного числа и COUT цифр после десятичной , например, 0,26547 -> 5.Как найти цифры после десятичного числа?

Я написал это, но не работает правильно:

 int main() 
{ 
int i=0,b; 
float a ; 
    cin>>a ; 
    while(a!=0) 
    { 
    a*=10 ; 
    b=a ; 
    a-=b ; 
    i+=1 ; 
} 
cout<<i ; 
} 

Например для 0.258 вместо 3, возвращает 20. можно мне объяснить, в чем проблема с этим кодом? спасибо

+1

https://docs.oracle.com/cd/E19957 -01/806-3568/ncg_goldberg.html – Lucero

+0

[Является ли это той же домашней проблемой] (http://stackoverflow.com/questions/41197021/separating-decimal-points-into-two-integers)? – PaulMcKenzie

+1

Проблема в том, что числа с плавающей запятой являются приблизительными. '.258' не может быть представлен точно, внутри это что-то вроде' .25800000000000001' или '.25799999999999999'. – Barmar

ответ

0

Я не уверен, почему ваш код не работает (Какой компилятор вы используете?), Но я думаю, что это, возможно, связано с

b=a; 

Попробуйте явно Отдавая свой поплавок к Int

b = int(a); 

в качестве альтернативы, вы можете выбрать не использовать Int, и вокруг поплавка вниз с помощью функции floor путем включения math.h #include <math.h>

float a = 5.9f; 
float b = floor(a); 
a -= b; 
2

C++ разрешает десятичное представление чисел с плавающей запятой, но насколько я знаю, все существующие реализации используют двоичное представление. И тогда идея сохранения спецификации десятичного числа пользователя как значения с плавающей запятой теряет критическую информацию о десятичных цифрах: их просто нет. Таким образом, чтобы подсчитать десятичные разряды в спецификации, вы должны сохранить его как строку.

Псевдокод:

  1. ввода спецификация число в виде строки, например, используя getline.
  2. убедитесь, что это действительная спецификация номера, например. используя stod.
  3. сканирования в течение первого периода справа, называют эту позицию P.
  4. сканирования для максимального числа десятичных цифр от позиции П.