2

我正在尝试制作一系列代码,根据用户输入的高度和半径计算圆锥的体积(见下文)。

我的问题是答案是错误的(但不是很长的路要走)。使用高度 = 5,半径 = 10 的示例,我从 500 的代码中得到答案(将 pi 视为 3),但手动计算我得到 ~523。

我假设它与我在下面声明 pi 的变量类型有关(双倍然后转换为长),但我一直在努力使变量类型的任何其他组合起作用。

下面的正确版本是什么,可以正确存储 pi(至少 5 或 6 个 dec 位置)?

                double piDouble = Math.PI;

                long height = Long.parseLong(heightString);
                long pi = (new Double(piDouble)).longValue();
                long radius = Long.parseLong(radiusString);

                long volumeBase = (pi*(radius*radius)*height) / 3;
4

2 回答 2

8

long pi = (new Double(piDouble)).longValue();是一个长的,所以它等于3,正好。

如果您需要更高的精度,请一直使用双精度,并仅在末尾舍入。这应该会给您预期的结果:

double piDouble = Math.PI;
long height = Long.parseLong(heightString);
long radius = Long.parseLong(radiusString);
double volumeBase = (piDouble * (radius * radius) * height) / 3;

如果需要,您可以对结果进行四舍五入:

long roundedDownVolume = (long) volumeBase; //round down
long roundedVolume = Math.round(volumeBase); //or round to the closest long
于 2012-10-08T13:15:30.473 回答
0

对于这种算术,您应该使用 BigDecimal。

于 2012-10-08T13:17:29.717 回答