计算C中小数点前后的位数

时间:2011-12-11 12:57:20

标签: c floating-point

我需要编写一个C程序,它将比较小数点前和小数点后的位数,并确保它们相等。

我如何计算小数点前后的10个幂?

这是我到目前为止所做的:

void main()
{
    is_equal(6757.658);   
}

INT is_equal(double x)
{
   int digits = 0;
   while (x) {
     x /= 10;
     digits++;
   }

   printf("%d ",digits);
}

有更好的方法吗?

4 个答案:

答案 0 :(得分:2)

你似乎不知道double / float变量的二进制表示,正如@AProgrammer建议的那样。

如果你使用float / double,你的工作是不可能的。你可以使用字符串来完成工作。

类似下面的内容。注意:这只是一个提示,而不是一个好的风格。

编辑:禁用cout,因为这是C

bool checkFloat(string); //the function checks whether the string have a float number format
void twoPart(string num)
{
    if (!checkFloat(num))
        return;
    int i = 0;
    int a = 0;//integer part
    int b = 0;//fractional part
    for(;i<num.length() && num[i]!='.'; i ++);
    a = i;
    b = num.length() - a - 1;
    if(i == num.length())
        b = 0;
    // print the result here
    //cout << a << " " << b << endl;
}

以上代码接受 123 123.456 .123

等数字

答案 1 :(得分:1)

这有点棘手。 IEEE浮点数不能完全代表大多数小数部分。数字6757.658表示为二进制十进制:0x1a65a872b020c5×2 -40 ,正好是6757.6580000000003565219230949878692626953125(我认为)。即,你的号码实际上有40个小数位。

这个最简单的解决方法是使用sprintf(buf, "%.10g", x);之类的格式进行格式化,然后使用int a, b; sscanf(buf, "%d.%d", &a, &b);读取部分。或者,您可以从int b = 1e10*(x - floor(x))开始,并将b除以10,直到它不是10的倍数(while (b%10 == 0) b /= 10;)。

答案 2 :(得分:0)

第3次尝试:

计算“。”之前和之后的“数字”数。

  • Null被视为不等于

  • 我没有测试此代码可能包含错别字。

    int is_equal(char *buffer)
    {
      char *temp;
      int leftLen,rightLen;
    
      temp = strtok(buffer,".");
      if (temp == null) return false;
    
      leftLen = strlen(temp);
    
      temp = strtok(buffer,".");
    
      if (temp == null) return false;
    
      rightLen = strlen(temp);
    
      return (leftLen == rightLen);
    }
    

旧东西......

这里会出现很多问题,C中的浮点数(双精度)并不总是精确到100%;如果执行乘法或除法。如果你乘以数字会改变。

解决此问题的最佳方法是将double渲染为字符串,然后解析该字符串。

您可以使用sprintf将格式化的double写入缓冲区。

OR

您可以跳过一起使用double,并使用字符串开头。

因此建立在马塞洛的答案上:

将用户的字符串读入名为buff

的缓冲区

然后用sscanf(buf, "%d.%d", &a, &b);

之类的语句解析它

buff是char *char []abint。您通过说a == b

进行测试
void main()
{
  is_equal("6757.658");   
}

int is_equal(char *x)
{
   int left,right;

   sscanf(x, "%d.%d", &left, &right);

   printf("Left digits: %d\n\r",left);
   printf("Right digits: %d\n\r",right);

   return (left == right);
}

答案 3 :(得分:-5)

#include <stdio.h>
#include <assert.h>

float main(void)
{
    int siz;
    assert (sizeof siz == sizeof (float));

    siz = is_equal(6757.658);
    printf( "Size=%d\n", siz);

    return 0.0;
}

int is_equal(double x)
{
    int digits;
    for (digits=0; x >= 1.0; digits++) {
        x /= 10;
    }

    return digits;
}