Как я могу удалить 2 цифры в неподписанном int? - PullRequest
0 голосов
/ 08 марта 2011

Итак, у меня есть 1.40 число, и я хочу удалить 1., чтобы я мог преобразовать 40 в двоичное число.Как я могу просто удалить 2 цифры?

Ответы [ 5 ]

2 голосов
/ 08 марта 2011

Единственный разумный способ сделать то, что вы хотите, это:

double x = 1.40;
int i;
snprintf(buf, sizeof buf, "%.2f", x);
i = atoi(buf+2);

Это выглядит уродливо и ужасно неэффективно, но проблема с другими подходами состоит в том, что 1.40 не существует в двоичной плавающей запятой. Вместо этого 1.40 соответствует ближайшему существующему значению с плавающей запятой, которое может быть немного меньше или чуть больше 1,40. Если меньше, то такие вещи, как (int)(x*100), дадут вам 139 вместо 140.

Использование snprintf как минимум гарантирует, что при оценке его будет использоваться та же семантика, которая будет использоваться для отображения значения.

Конечно, то, что вы делаете, вероятно, не имеет смысла для начала. Это 1,40 долларов и центов (или аналог в другой валюте)? Если это так, вы должны просто хранить целое число центов для начала. Плавающая точка должна никогда не использоваться для валюты.

0 голосов
/ 08 марта 2011

Я думаю, что вы пытаетесь выяснить двоичную форму любого числа и для которого вам на самом деле не нужно его разбивать.

Но если вам это нужно, вот, пожалуйста ...

#include<iostream.h> 
int main()
{
    double i = 2.40;
    unsigned int j;
    float k;
    j = (int) i / 1;
    k =  i - j ; 
    cout << k;
    return 0;
}
0 голосов
/ 08 марта 2011

Один из подходов состоит в том, чтобы взять входные данные как число с плавающим указателем, затем вычесть целую часть и умножить на 100:

unsigned int v = (my_double - floor(my_double)) * 100

Примечание: использование пола как это гарантирует, что расчет работает, даже если my_double находится вне диапазона INT_MIN..INT_MAX.

Другой подход заключается в том, чтобы взять входные данные в виде строки, перейти к первому. И преобразовать остальные ...

const char* p = strchr(my_input, '.');
if (p)
{
    unsigned int v = atoi(p + 1);
    // use v...
}
0 голосов
/ 08 марта 2011

Я не программист на C, но думаю, что не допустил ошибок:

double y = x - floor(x);
while(y - floor(y) != 0.0){
    y *= 10.0;
    // y %= 10.0, which is
    y -= floor(y / 10) * y

    // The current digit is:
    // floor(y)
    // Push it to a character array or whatever you wanna do.
    // The order for 1.45 is: 4 then 5, for 1.40 it's only 4
}
0 голосов
/ 08 марта 2011

Предполагается, что 1.40 хранится как число с плавающей запятой или двойное число:

double x = 1.40;
int hundreths = (int)(x * 100) % 100;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...