菜鸡写的代码
Topic source倒数第三行: double Percentage_increase = 100*(gradse_this - gradse_last)/gradse_last;
因为(gradse_this - gradse_last)的结果是Int型,gradse_last也是int型,导致(gradse_this - gradse_last)/gradse_last只会得到int型的结果。
假如(gradse_this - gradse_last)/gradse_last的实际结果是浮点数,虽然声明了变量Percentage_increase是double类型,但是计算机在计算(gradse_this - gradse_last)/gradse_last时会自动忽略小数的部分,先得到一个int型的结果,再将这个已经忽略小数点的Int型结果转成double型(就是在小数点后面默认加0)。即使改成double Percentage_increase = (double) (100*(gradse_this - gradse_last)/gradse_last) ; ,小数点之后的精度还是会丢失。
例如输入gradse_this=69,gradse_last=123,输出的结果会是-43.00%,而正确结果应该是-43.90%。
解决办法很简单,只需将运算的其中一个变量转换成浮点型:
double Percentage_increase = 100*(gradse_this - gradse_last)/(gradse_last*1.0);
(gradse_last*1.0):gradse_last是int型,1.0是浮点型,那么(gradse_last*1.0)就是浮点型,于是100*(gradse_this - gradse_last)/(gradse_last*1.0)的结果就是浮点型,而且不会丢失小数点之后的精度。
- 1
前进四
import java.util.Scanner;
public class Practice_Scanner01
{
public static void main (String[] args)
{
//java获取输入
Scanner scanner = new Scanner(System.in);
System.out.print("Input your name: ");
String name = scanner.nextLine();
System.out.print("Input your age: ");
int age = scanner.nextInt();
System.out.printf(" Hi,%s,you are %d\n ", name , age );
//practice
System.out.print("Input your Results of the last examination: ");
int gradse_last = scanner.nextInt();
System.out.print("Input your Results of this examination: ");
int gradse_this = scanner.nextInt();
System.out.printf("Hi,%s. Your gradse_this - gradse_last is:%d\n ",name, gradse_this - gradse_last);
double Percentage_increase = 100*(gradse_this - gradse_last)/gradse_last;
//%0.2f表示取小数点后两位
System.out.printf("Percentage increase in achievement is %.2f%%\n ",Percentage_increase);
}
}