java算法编程题:计算球的体积

题目:计算球的体积
对于半径为r的球,其体积的计算公式为V=4/3*∏r3(三分之四乘以∏乘以r乘以r乘以r),这里取∏=3.14。现给定r,即球半径,类型为double,求球的体积V,保留到小数点后2位。
输入:输入一个不超过100的非负实数,即球半径,类型为double。
输出:输出一个实数,即球的体积,保留到小数点后2位。

import java.math.BigDecimal;
import java.util.Scanner;
/**
 * @author zql
 */
public class BallVolume {

	@SuppressWarnings("resource")
	public static void main(String[] args) {
		Scanner in = new Scanner(System.in);
		System.out.println("请输入一个不超过100的非负实数");
		double r = in.nextDouble();
		if (r <= 0 || r > 100) {
			System.out.println("输入的数据不合法!");
		} else {
			System.out.println("球的体积为:" + getBallVolume(r));
		}
	}
	
	/**
	 * 获取球的体积
	 * 
	 * @param r 半径
	 * @return 球的体积
	 */
	public static double getBallVolume(double r) {
		BigDecimal r3 = new BigDecimal(r);
		// 等价于r*r*r
		r3 = r3.multiply(r3).multiply(r3);
		BigDecimal v = new BigDecimal(4);
		// 等价于4 / 3 * 3.14 * r * r * r,这里需要注意的是,4/3结果是无限循环小数,所以需要处理精度问题
		// 否则会报Non-terminating decimal expansion; no exact representable decimal result
		v = v.divide(new BigDecimal(3), 10, BigDecimal.ROUND_HALF_DOWN).multiply(new BigDecimal(3.14)).multiply(r3);
		// 保留两位小数,五舍六入
		return v.setScale(2, BigDecimal.ROUND_HALF_DOWN).doubleValue();
	}
}

知识点如下:
方法介绍

方法 说明
add(BigDecimal) BigDecimal对象中的值相加,然后返回这个对象。
subtract(BigDecimal) BigDecimal对象中的值相减,然后返回这个对象。
multiply(BigDecimal) BigDecimal对象中的值相乘,然后返回这个对象。
divide(BigDecimal) BigDecimal对象中的值相除,然后返回这个对象。
toString() 将BigDecimal对象的数值转换成字符串。
doubleValue() 将BigDecimal对象中的值以双精度数返回。
floatValue() 将BigDecimal对象中的值以单精度数返回。
longValue() 将BigDecimal对象中的值以长整数返回。
intValue() 将BigDecimal对象中的值以整数返回。

特别说明,使用divide时,建议设置小数位数,即使用divide(BigDecimal divisor, int scale, int roundingMode)方法,否则出现无限循环小数时,会报Non-terminating decimal expansion; no exact representable decimal result错误,其中,divisor是除数,scale是小数位数,roundingMode是小数模式。
小数模式介绍

模式 说明
BigDecimal.ROUND_HALF_UP 四舍五入
BigDecimal.ROUND_HALF_DOWN 五舍六入
BigDecimal.ROUND_UP 进位处理(就是直接加1)
BigDecimal.ROUND_DOWN 直接去掉尾数
BigDecimal.ROUND_UNNECESSARY 不需要舍入操作
BigDecimal.ROUND_HALF_EVEN 如果舍弃部分左边的数字为奇数,则四舍五入,如果为偶数,五舍六入
BigDecimal.ROUND_FLOOR 如果 BigDecimal 为正,直接去掉尾数,如果为负,进位处理,注意,这种舍入模式永远不会增加计算值。
BigDecimal.ROUND_CEILING 如果 BigDecimal 为正,进位处理,如果为负,直接去掉尾数,注意,这种舍入模式不会降低计算值。

构造器介绍

构造器 说明
BigDecimal(int) 创建一个具有参数所指定整数值的对象。
BigDecimal(double) 创建一个具有参数所指定双精度值的对象。
BigDecimal(long) 创建一个具有参数所指定长整数值的对象。
BigDecimal(String) 创建一个具有参数所指定以字符串表示的数值的对象。
发布了55 篇原创文章 · 获赞 25 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/mr_zql/article/details/98256396