簡體   English   中英

格式化浮點數以使用兩點精度顯示時保留精度(Java)

[英]Preserving Accuracy When Formatting a Floating Point Number to Display With Two-point Precison (Java)

這是程序。 它是根據工作時數,小時費率,預扣稅等來計算員工的凈工資。它可以正確計算,但是雙點精度格式四舍五入到最后一個小數點,從而失去了計算的准確性。

輸入樣例:

姓名: 史密斯
本周工作時間: 10
每小時收費: 6.75
聯邦預扣稅: 20%
撤銷州稅: 9%

輸出:

摘要

員工: 史密斯
總薪水: 67.50
聯邦預扣稅: 13.50
狀態預扣稅: 6.08
總扣除額: 19.58
凈工資: 47.93

import java.util.*;
public class Payroll
{
    static Scanner key = new Scanner(System.in);
    public Payroll()
    {
        System.out.print("Name: ");
        String name = key.next();

        System.out.print("Hours worked this week: ");
        int hoursWorked = key.nextInt();
        System.out.print("Hourly rate: ");
        double payRate = key.nextDouble();

        double payPreTax = hoursWorked * payRate;

        System.out.print("Federal tax withhold: ");
        String fedTaxStr = key.next().replace("%", "");
        double fedTax = ((Double.parseDouble(fedTaxStr)) / 100) * payPreTax;

        System.out.print("State tax withold: ");
        String stateTaxStr = key.next().replace("%", "");
        double stateTax = ((Double.parseDouble(stateTaxStr)) / 100) * payPreTax;

        double amountWithheld = fedTax + stateTax;

        double payPostTax = payPreTax - amountWithheld;

        System.out.printf("\nSummary\n\nEmployee: " + name + "\nGross Pay: %.2f\nFederal Withholding: %.2f\nState Withholding: %.2f\nTotal Deduction: %.2f\nNet Pay: %.2f", payPreTax, fedTax, stateTax, amountWithheld, payPostTax);
    }
    public static void main(String[] args)
    {
        new Payroll();
    }

}

請憐憫; 我是一年級。

格式化浮點數以兩點精度顯示時保留精度

您要的是自相矛盾/不可能的。

你說:

它可以正確計算,但是雙點精度格式將最后一位小數舍入,從而失去了計算精度。

那是對的。 浮點計算可能會精確到至少10個小數點。 如您所注意到的,當您在printf調用中使用%.2f格式化數字時,實際上會發生准確性(舍入)的損失。

簡而言之,您不能“保留准確性”,也不能僅以2個小數點的精度打印出數字。

一種簡單的解決方案是在小數點后再打印更多位數。 即使用不同的格式說明符作為數字。 (例如... %.4f將為您提供小數點后四位數!)

我建議您閱讀Formatterjavadocs ,其中解釋了格式說明符的含義。


其實,有另一種看待這個問題的方法。 您在此處使用double進行計算。 double是二進制(基數為2)浮點表示形式。 許多十進制數字不能用二進制浮點數精確表示。 (出於同樣的原因,在小數浮點數中不能精確表示1 /3。)

在會計軟件中處理此問題的通常方法是將貨幣值表示為整數(例如,整數的美分)或十進制浮點數表示。 在Java中, BigDecimal是表示十進制浮點數的標准方法。 它可以應付任意精度。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM