decPlace_volume = floor(volume+.05) - ceil(volume); //should output -1, 0, or 1
decPlace_volume = pow(decPlace_volume,2); //should the above == -1, this should turn it into 1 while making 0 remain 0
我的作业唯一允许的库是stdio.h和math.h。
我的任务非常简单 - 找到圆柱体的表面积和体积,输出的精度应为1,除非输出小数为0,在这种情况下不应打印小数。
以上是我提出的(表面区域只是不同的变量)。如果第一行的输出为-1,则第二行应该为正,0应保持为零(整数因此不必担心时髦的东西)。
出于某种原因,当第一行输出0时,第二行输出1.这里是否有我遗漏的东西?
答案 0 :(得分:0)
您的问题要求取消小数,如果它是0
,这是一种方法
#include<stdio.h>
#include<string.h>
int main()
{
char buffer[25];
double volume;
volume = 1.234;
sprintf (buffer, "%.1f", volume); // convert to string with 1 place
if (strstr(buffer, ".0") != NULL) // examine string
sprintf (buffer, "%.0f", volume); // redo the string with 0 places
printf ("Volume = %s\n", buffer);
volume = 1.01;
sprintf (buffer, "%.1f", volume);
if (strstr(buffer, ".0") != NULL)
sprintf (buffer, "%.0f", volume);
printf ("Volume = %s\n", buffer);
return 0;
}
节目输出:
Volume = 1.2
Volume = 1
答案 1 :(得分:0)
由于浮点的典型二进制实现,OP的方法在0.01的倍数附近遇到问题。而是对未更改的除非输出小数为0,否则输出的精度应为1,在这种情况下,不应打印小数。
volume
的输出进行后处理。
使用snprintf()
double volume = foo();
char buffer[100];
buffer[0] = 0;
int len = snprintf(buffer, sizeof buffer, "%.1f", volume);
if (len > 0 && buffer[len-1] == '0') buffer[--len] = '\0';
puts(buffer);
答案 2 :(得分:0)
好的fellas感谢你的帮助,我明白了。出于某种原因,我认为我的第一行可以输出1,但它不会赢。而不是
decPlace_volume = pow(decPlace_volume,2);
转换,我刚为decPlace_volume *= -1;
开了一行。
再次感谢!