【问题标题】:Java - double*int arithmatic displays with two decimals OR several decimal placesJava - double*int 算术显示两位小数或几个小数位
【发布时间】:2016-02-04 20:28:36
【问题描述】:

Java 新手。我正在为一个项目编写一个简单的程序。这是一个允许用户购买披萨的程序。它最后有一个运行总计和一个订单摘要。我正在使用这些行来保留总计和小计:

switch(mainMenuAnswer) //Switch statement to get correct pricing multiplied by # of desired pizza ordered  
{            
    case 1:
        total = total + (pizzaPrices1[otherAnswer - 1] * count);
        miniTotal = pizzaPrices1[otherAnswer - 1] * count;
        break;

    case 2:
        total = total + (pizzaPrices2[otherAnswer - 1] * count);
        miniTotal = pizzaPrices2[otherAnswer - 1] * count;
        break;

    case 3:
        total = total + (pizzaPrices3[otherAnswer - 1] * count);
        miniTotal = pizzaPrices3[otherAnswer - 1] * count;
        break;

    case 4:
        total = total + (pizzaPrices4[otherAnswer - 1] * count);
        miniTotal = pizzaPrices4[otherAnswer - 1] * count;
        break;

    case 5:
        total = total + (pizzaPrices5[otherAnswer - 1] * count);
        miniTotal = pizzaPrices5[otherAnswer - 1] * count;
        break;

}

Total 和 miniTotal 是从 0.0 开始的双精度数,而价格采用 ##.## 格式,后跟 count,它是一个整数值。它们正在成倍增加。

有时我会得到一个很好的答案,例如 $42.35(随机数),但有时我会得到:

 How many large pizzas?: 4

---------------------------------------------------------

Your current order total is $151.91

---------------------------------------------------------

Specialty Pizza Menu

1) Meat Lovers
2) BBQ Chicken
3) Hawaiian
4) Chicken-Bacon Ranch
5) Vegetarian
6) Exit Menu

Your choice?: 6

Order Summary:

Type                   Size          Quantity    Price
---------------------------------------------------------
Meat Lovers            Large         5           $99.94999999999999 
BBQ Chicken            Large         4           $51.96 

Order total: $151.91
---------------------------------------------------------

请注意,所有内容都被格式化(以防万一)到小数点后两位,“价格”下方的双精度值除外。我也很容易格式化它,但我不知道如何。要格式化的代码行是:

System.out.printf("%-22s %-13s %-11d %-2s \n" , typeArray[i], sizeArray[i], quantityArray[i], priceArray[i]); //Formatting

我尝试使用%-11.2d,但它给了我一个错误。有人知道发生了什么吗?我认为它与变量 double 和 memory 位有关,但什么是好的解决方案?

注意:priceArray 是一个 STRING 数组,格式为 $##.##。

【问题讨论】:

  • 使用双打货币是一个坏主意(正如您所发现的那样)。您需要十进制数据类型,或者只需将所有计算都保存在便士中
  • 在我完成这个程序一半之前我不知道 Currency 类,否则我会使用它
  • @Andremoniy 因为我是我的第一个来自 C++ 的 Java 课程,并且必须根据我的教授给我的内容遵循我们的程序的特定格式(这就是程序看起来和格式化的原因它是这样的),我可以向你保证,我知道循环是什么,等等。我说你的评论没用,因为它就是这样。我不在乎你从哪里买披萨,考虑到我们需要遵循严格的编程项目格式,你无权抱怨我的写作风格(当然你不知道,但仍然决定咆哮)
  • 我想补充一点,这个问题应该被关闭,因为你没有提供真正的 MCVE (stackoverflow.com/help/mcve)
  • @bankey 经常看到它运行会让世界更容易理解;你可以玩它并实时调试它。包括你需要运行的所有东西(包括 main 方法)会给你一个更高的答案率,有时你会在将代码缩减到最小示例时自己找到答案。在这种情况下,我会建议删掉所有的比萨饼,找到一个给出 99.9499999 的方程,然后尝试格式化它

标签: java formatting double


【解决方案1】:

由于价格数组是一个字符串数组,你不能给它数字格式。将其保留为双精度数组,并在末尾使用双精度到 2 的十进制字符串转换。

【讨论】:

    【解决方案2】:

    使用 11.2d 用于双重格式化,而您的数组是字符串。您可能想使用一些字符串方法来按您希望的方式对其进行格式化。

    https://docs.oracle.com/javase/7/docs/api/java/lang/String.html

    找到“。”然后再添加两个索引并切断其余部分。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-08
      • 2011-05-27
      • 2021-04-18
      • 1970-01-01
      相关资源
      最近更新 更多