如何删除unsigned int中的2位数?

时间:2011-03-08 06:23:17

标签: c

所以我有1.40个号码,我想删除1.,因此我可以将40转换为二进制数。我怎样才能删除2位数?

5 个答案:

答案 0 :(得分:2)

做你想做的唯一理智的方法是:

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美元和美分(或其他货币相似)?如果是这样,你应该只是存储整数个美分开头。浮动点永远不会用于货币。

答案 1 :(得分:0)

假设1.40存储为浮点或双精度:

double x = 1.40;
int hundreths = (int)(x * 100) % 100;

答案 2 :(得分:0)

一种方法是将输入作为浮动指针编号,然后减去整数部分并乘以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...
}

答案 3 :(得分:0)

我不是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
}

答案 4 :(得分:0)

我想你试图弄清楚任何数字的二进制形式,你实际上不需要拆分它。

但是如果你确实需要它,那你就去......

#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;
}