梁勇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");
}
}
浙公网安备 33010602011771号