这是因为1 / 3 是作为整数除法完成的,因为两个操作数都是int(a) 类型。所以最终结果为零。
您只需确保其中一个操作数为非整数即可获得预期效果,例如:
v = (1.0f / 3) * pi * r * r * r;
这会起作用,因为它会产生0.333... 的浮点数(在括号内)。但是,绝对没有真正的原因需要复制教科书中显示的方程式,您可以使用更简单的方法获得相同的结果:
v = pi * r * r * r / 3;
因为所有这些变量都是浮点数,所以最终something / 3 的结果也是作为浮点数完成的。
而且,只是一些快速建议,您可能想考虑使用double 类型而不是float。 float 类型通常使用较少的空间,但除非您有大型数组,否则这通常不是问题。 double 类型提供了更大的范围和精度。
此外,3.14 并不是真正 精确的 pi 值。大多数实现将在math.h 中定义一个M_PI 常量供您使用,但标准没有强制要求。因此,您可以使用这样的方法来获得更准确的值:
#include <stdio.h>
#include <math.h>
// Define if implementation doesn't provide.
#ifndef M_PI
#define M_PI 3.14159265358979323846
#endif
static void GetRadiusAndPrintVolume(void) {
printf("\nEnter the radius: ");
double radius;
scanf("%lf", &radius);
double volume = M_PI * radius * radius * radius / 3;
printf("Volume for radius %f is %f\n", radius, volume);
}
int main() {
GetRadiusAndPrintVolume();
}
最后,您可能想检查您的方程式。虽然您没有明确说明,但它非常看起来应该是球体的体积。
如果是,公式应该是<sup>4</sup>/<sub>3</sub> π r<sup>3</sup> 而不是<sup>1</sup>/<sub>3</sub>。因此,声明将是:
double volume = M_PI * radius * radius * radius * 4 / 3;
(a) 如果您有兴趣,C 标准的“常用算术转换”部分(C11 中的 6.3.1.8 部分)涵盖了所有内容:
许多期望算术类型的操作数的运算符会以类似的方式导致转换和产生结果类型。目的是确定操作数和结果的通用实数类型。
然后继续列出特定情况下发生的情况,通常是“较小”(就其范围和/或精度而言)操作数升级为与“较大”操作数相同的类型。这是基本的想法,如果你想要完整的图片,你应该参考前面提到的部分。
在您的特定情况下,由于1 / 3 的两个操作数都是int 类型,因此计算和结果将作为int 完成,这意味着它会截断小数部分(给出零)。