Discuss / Java / 菜鸡写的代码

菜鸡写的代码

Topic source

前进四

#1 Created at ... [Delete] [Delete and Lock User]

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);

    }

}

Aaaaaaaaaa

#2 Created at ... [Delete] [Delete and Lock User]

倒数第三行: 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

Reply