一、前言
emm 这题貌似就是给 c++准备的,别的语言还有输出格式要求。。。本文用 Java 来做这个题,很简单的题 but 格式化输出搞得我有点难受。
二、代码与分析
import java.util.*;
import java.math.*;
public class Main{
public static void main(String[] args){
Scanner scan=new Scanner(System.in);
double m,h,bmi;
m=scan.nextDouble();
h=scan.nextDouble();
bmi=m/(h*h);
if(bmi<18.5)
System.out.println("Underweight");
else if(bmi>=18.5&&bmi<24)
System.out.println("Normal");
else{
BigDecimal bd=new BigDecimal(bmi).round(new MathContext(6,RoundingMode.HALF_UP));
System.out.println(bd.stripTrailingZeros().toPlainString());
System.out.println("Overweight");
}
}
}
由于该题思路很简单,本文就着重谈一谈 Java 格式化输出的问题。题目要求是这样的:
对于非 C++ 语言,在输出时,1.请四舍五入2.保留六位有效数字输出,3.如果小数部分存在后缀 00,不要输出后缀 00。也就是说有三个要求。
BigDecimal bd=new BigDecimal(bmi).round(new MathContext(6,RoundingMode.HALF_UP));
new MathContext(6, RoundingMode.HALF_UP)
表示创建一个 MathContext
对象,其中 6
表示有效数字的位数,RoundingMode.HALF_UP
表示使用四舍五入的舍入规则。
stripTrailingZeros()
: 这个方法用于去除小数部分尾部多余的零。例如,如果 BigDecimal
表示的是 3.12000
,则 stripTrailingZeros()
会将多余的零去掉,得到 3.12
。
toPlainString()
: 这个方法用于将 BigDecimal
对象转换为字符串。通常,在直接输出 BigDecimal
对象时,会使用 toString()
方法,但 toPlainString()
提供了一种更简洁的输出形式,不使用指数表示法,并且不输出尾部的零。
实际上采用了stripTrailingZeros()的话,后面用 toString()也没问题,或者用了 toPlainString(),不采用stripTrailingZeros()也可以。毕竟这俩都是为了末尾不输出 0.
三、参考资料
https://www.cnblogs.com/wujiuqier/articles/17708035.html