簡體   English   中英

計算C中小數點前后的位數

[英]Counting the number of digits before and after the decimal point in C

我需要編寫一個C程序,該程序將比較小數點前和小數點后的位數,並確保它們相等。

如何計算小數點前后的十個冪?

這是我到目前為止的內容:

void main()
{
    is_equal(6757.658);   
}

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

   printf("%d ",digits);
}

有一個更好的方法嗎?

您似乎不知道@AProgrammer建議的雙精度/浮點型變量的二進制表示形式。

如果使用float / double,則您的工作是不可能的。 您可以為工作使用字符串。

注意:這只是一個提示,而不是一種好的樣式。

編輯:因為這是C禁用cout

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,0.123

有點棘手。 IEEE浮點數不能准確表示大多數十進制小數。 數字6757.658表示為二進制十進制:0x1a65a872b020c5×2 -40 ,恰好是6757.6580000000003565219230949878692626953125(我認為)。 即,您的電話號碼實際上有40個小數位。

最簡單的解決方法是使用sprintf(buf, "%.10g", x);類的格式對其進行格式化sprintf(buf, "%.10g", x); ,然后使用int a, b; sscanf(buf, "%d.%d", &a, &b);讀回這些部分int a, b; sscanf(buf, "%d.%d", &a, &b); int a, b; sscanf(buf, "%d.%d", &a, &b); 或者,您可以從int b = 1e10*(x - floor(x))然后將b除以10,直到它不是10的倍數( while (b%10 == 0) b /= 10; ) 。

第三次嘗試:

計算“。”之前和之后的“數字”數。

  • 空被認為不等於任何東西

  • 我沒有測試此代碼,它可能包含錯別字。

     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寫入緩沖區。

要么

您可以一起跳過使用double並使用字符串開頭。

因此,基於Marcelo的答案:

從用戶讀取字符串到稱為buff的緩沖區

然后使用sscanf(buf, "%d.%d", &a, &b);類的語句對其進行解析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);
}
#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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM