[英]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 []
, a
和b
是int
。 您通過說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.