我需要编写一个C程序,它将比较小数点前和小数点后的位数,并确保它们相等。
我如何计算小数点前后的10个幂?
这是我到目前为止所做的:
void main()
{
is_equal(6757.658);
}
INT is_equal(double x)
{
int digits = 0;
while (x) {
x /= 10;
digits++;
}
printf("%d ",digits);
}
有更好的方法吗?
答案 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 []
,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);
}
答案 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;
}