题目:计算球的体积
对于半径为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) | 创建一个具有参数所指定以字符串表示的数值的对象。 |