我正在编写一个计算人的BMI的程序。这是我给出的任务:
"身体质量指数(BMI)衡量体重的健康状况。它的计算方法是将体重(千克)除以身高(米)的平方。编写一个程序,提示用户输入以磅为单位的重量W和以英寸为单位的高度H,并显示BMI。请注意,一磅是0.45359237千克,一英寸是0.0254米。"
输入:(第1行)实数在50到200之间 (第2行)实数在10到100之间
输出:BMI值(浮点应该只打印到第二个小数点)
问题是每当我使用" System.out.printf("%。2f \ n",BMI)"时,输出都会向上舍入而不是切断其余的小数点。这是我的代码:
import java.util.Scanner;
public class Main
{
public static void main(String[] args)
{
Scanner input = new Scanner(System.in);
double weight = input.nextDouble();
double height = input.nextDouble();
double weightKG;
double heightM;
double heightMSquare;
double BMI;
final double kilogram = 0.45359237;
final double meter = 0.0254;
while ((weight > 200) || (weight < 50)) // Error catching code.
{
weight = input.nextDouble();
}
while ((height > 100) || (height < 10))
{
height = input.nextDouble();
}
weightKG = weight * kilogram; // Convert pounds and inches to
kilograms and meters.
heightM = height * meter;
heightMSquare = Math.pow(heightM, 2); // Compute square of height in
meters.
BMI = weightKG / heightMSquare; // Calculate BMI by dividing weight
by height.
System.out.printf("%.2f\n", BMI);
}
}
答案 0 :(得分:1)
这是我写的一个方法,用正则表达式和字符串操作来解决这个问题。
private static String format2Dp(double x) {
String d = Double.toString(x);
Matcher m = Pattern.compile("\\.(\\d+)").matcher(d);
if (!m.find()) {
return d;
}
String decimalPart = m.group(1);
if (decimalPart.length() == 1) {
return d.replaceAll("\\.(\\d+)", "." + decimalPart + "0");
}
return d.replaceAll("\\.(\\d+)", "." + decimalPart.substring(0, 2));
}
我所做的是将双精度转换为字符串,从中提取小数部分并对小数部分进行子串。如果小数部分只有1个字符长,则在末尾添加零。
此方法也适用于以科学计数法表示的数字。