梁勇Java语言程序设计(基础篇)2.22的小心得

原题目为:
2.22(财务应用:货币单位)改写程序清单2-10,解决将double型值转换为int型值时可能会造成精度损失的问题。输入的输入值是一个整数,其最后两位代表的是美分币值。例如:1156就代表的是11美元56美分。

/*程序清单2-10*/
import java.util.Scanner;

public class ComputeChange {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner input = new Scanner(System.in);
		
		System.out.print("Enter an amount in double, for example 11.56: ");
		double amount = input.nextDouble();
		
		int remainingAmount = (int)(amount*100);
		int numberOfOneDollars = remainingAmount/100;
		remainingAmount %= 100;
		
		int numberOfQuarters = remainingAmount/25;
		remainingAmount %= 25;
		
		int numberOfDimes = remainingAmount/10;
		remainingAmount %= 10;
		
		int numberOfNickels = remainingAmount/5;
		remainingAmount %= 5;
		
		int numberOfPennies = remainingAmount;
		
		System.out.println("Your amount " + amount + " consists of");
		System.out.println("   " + numberOfOneDollars + " dollars");
        System.out.println("   " + numberOfQuarters + " quarters");
        System.out.println("   " + numberOfDimes + " dimes");
        System.out.println("   " + numberOfNickels + " nickels");
        System.out.println("   " + numberOfPennies + " pennies");
	}

}

关于这个程序有一个严重问题是将一个double型的总钱数转换为int型数remainingAmount时可能会损失精度,这会导致不精确的结果。如果输入的总额值为10.03,那么10.03100就会变成1002.9999999999999,程序会显示10个1美元和2个1美分。为了解决这个问题,使用的方法是用int remainingAmount = (int)((amount+0.005)100);这个语句,因为精度损失的话范围不会太大,而强制类型转换是截尾的。所以这样不会导致不正确,但是最多到小数点后两位的要求必须是明确的。
修改后的程序为

import java.util.Scanner;  
public class ComputeChangePlus{  
    public static void main(String[] args){  
        Scanner input = new Scanner(System.in);  
        System.out.print("Enter an amount in double , for example 11.56: ");  
        double amount = input.nextDouble();  
        int remainingAmount = (int)((amount+0.005)*100);  
          
        int numberOfOneDollars = remainingAmount / 100;  
        remainingAmount = remainingAmount % 100;  
          
        int numberOfQuarters = remainingAmount / 25;  
        remainingAmount = remainingAmount % 25;  
          
        int numberOfDimes = remainingAmount / 10;  
        remainingAmount = remainingAmount % 10;  
          
        int numberOfNickels = remainingAmount / 5;  
        remainingAmount = remainingAmount % 5;  
          
        int numberOfPennies = remainingAmount;  
          
        System.out.println("Yours amount " + amount + " consists of");  
        System.out.println("    " + numberOfOneDollars + " dollars");  
        System.out.println("    " + numberOfQuarters + " quarters");  
        System.out.println("    " + numberOfDimes + " dimes");  
        System.out.println("    " + numberOfNickels + " nickels");  
        System.out.println("    " + numberOfPennies + " pennies");  
          
    }  
}  
posted @ 2017-04-12 17:54  DeveloperAndrewLee  阅读(532)  评论(0)    收藏  举报