题目:计算球的体积
对于半径为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)

创建一个具有参数所指定以字符串表示的数值的对象。