【问题标题】:Truncate double or add extra 0 to the decimal - Java截断双精度数或将额外的 0 添加到小数点 - Java
【发布时间】:2024-01-22 02:14:01
【问题描述】:

这可能是重复的,但我找不到任何适用于我的代码的答案。

我正在尝试为 Java 中的一种方法(用于计算费用)截断结果。然后我尝试将结果写入文本文件,但它并没有像应有的那样显示。这是我得到的,也是我希望它返回的:

  1. 费用结果是8.4,应该返回8.40
  2. 费用结果是8.0,应该返回8.00

等等……有什么建议吗?

这是我的方法的完整代码:

public Double calculateFee(Parcel pcl) {    
    // Get type of parcel (E, S or X)
    String typeOfParcel = pcl.getParcelID().substring(0,1);
    // Formula for calculating fee
    Double fee = (double) 1 + Math.floor(pcl.getVolume()/28000) + (pcl.getDays()-1);

    // apply a discount to parcels of type "S"
    if (typeOfParcel.equalsIgnoreCase("S")) {
        fee = fee * 0.9;
    }

    // apply a discount to parcels of type "X"
    else if (typeOfParcel.equalsIgnoreCase("X")) {
        fee = fee * 0.8; 
    } 

    // This is what I tried:
    // Tried also using #.##, but no result
    DecimalFormat decim = new DecimalFormat("0.00");
    fee = Double.parseDouble(decim.format(fee));

    return fee;     
} 

【问题讨论】:

  • 你为什么要再次解析格式化的双精度数以返回双精度数?只需返回DecimalFormat.parse返回的字符串形式即可。
  • @RohitJain 是正确的:这是无意义的代码
  • 为什么你返回 double 作为格式化代码的结果,而不是 String
  • 我不知道格式不能应用于 Double 类型。对不起,初学者的错误。

标签: java formatting double truncate


【解决方案1】:

一种方法是使用 String.format()。

  Double fee = 8.0;
  String formattedDouble = String.format("%.2f", fee );

请注意,Double 不保存其值的格式化表示。

有关格式字符串的更多详细信息,请参阅here

【讨论】:

    【解决方案2】:

    这里的问题不在于您的格式错误。您正在使用以下格式格式化您的双精度:

    decim.format(fee);
    

    然后,您将这个字符串解析为 Double,因此会丢失格式:

    Double.parseDouble(...
    

    只返回一个String而不是一个Double,不要使用Double.parseDouble。

    【讨论】:

    • 嗯.. 现在我明白我做错了什么。这说得通!感谢@aglassman 的解释。
    • 你应该说使用什么来代替 .parseDouble
    • @Wrong 我回答的最后一行解释了该怎么做。
    最近更新 更多