-3

有谁知道我的输出问题在哪里?

我编写了一个 Java 程序,并使用 Eclipse 在 Mac lion 上的 VM 上运行它。1.41我没有得到,而是1.4100000000000001上了我的机器。

Example:
Enter the number of quarter: 4
Enter the number of dimes: 3
Enter the number of nickels: 2
Enter the number of pennies: 1

Total $1.4100000000000001

Example: 
Enter the number of quarter: 3
Enter the number of dimes: 2
Enter the number of nickels: 1
Enter the number of pennies: 6

Total $1.06

Example:
Enter the number of quarter: 5
Enter the number of dimes: 7
Enter the number of nickels: 4
Enter the number of pennies: 4

Total $2.1900000000000004

有时输出是正确的,而其他时候有问题。

代码:

import java.util.*;

public class CountChange
{
    public static void main(String[]args)
    {   
        Scanner inputScanner = new Scanner(System.in);
        System.out.print("Enter the number of quarters: ");
        int quarters = inputScanner.nextInt();
        System.out.print("Enter the number of dimes: ");
        int dimes = inputScanner.nextInt();
        System.out.print("Enter the number of nickles: ");
        int nickles = inputScanner.nextInt();
        System.out.print("Enter the number of pennies: ");
        int pennies = inputScanner.nextInt();
        inputScanner.close();

        double total =0.00;
        total = quarters * 0.25 + dimes * 0.1 + nickles * 0.05 + pennies * 0.01;

        System.out.println("Total $" + total);
        System.out.print("Thank you");
    }
}
4

3 回答 3

2

您的问题与浮点(容易放置,float/double相关计算)的发生方式有关。浮点数是一种近似表示(如果您对背后的理论感兴趣,标准是IEEE754)。在这里,您得到的正是那个,一个近似的表示。

由于您处理的货币仅以美分计(您不能拥有 0.0001 美元的货币),因此我建议将具有int(或long,或任何整数类型)值的值表示为美分。然后,在显示结果时除以 100。

于 2013-10-03T20:31:00.890 回答
1

您已经体验过将浮点数表示为doubles 的不精确性。数字 0.1 不能用二进制精确表示,所以当你0.1用 Java 说时,你会得到最接近0.1. 同样的事情适用于0.050.01

您可以做几件事:

  • 尽可能推迟浮点运算。

例子:

total = quarters * 25 + dimes * 10 + nickles * 5 + pennies;
total /= 100.0;

例子:

DecimalFormat df = new DecimalFormat("0.00");
System.out.println("Total $" + df.format(total));

这些变通方法都没有解决基本问题 - 数字的不精确表示double。尤其是金额大的,千万不要用double。您甚至可以使用 aBigDecimal代替,其精度是任意的。

于 2013-10-03T20:31:24.983 回答
0

我同意您遇到此问题的原因的解释。对于 Java 中的这种情况,我推荐的解决方案是使用 BigDecimal。它完全可以进行那些您期望对于短小数部分精确的计算。对于不精确的计算,它提供了一个很好的舍入方法选择。

实际上,它使用比例因子进行整数运算,但自动存储和管理比例。

于 2013-10-03T23:04:38.377 回答