[英]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
將為您提供小數點后四位數!)
我建議您閱讀Formatter
的javadocs ,其中解釋了格式說明符的含義。
其實,有另一種看待這個問題的方法。 您在此處使用double
進行計算。 double
是二進制(基數為2)浮點表示形式。 許多十進制數字不能用二進制浮點數精確表示。 (出於同樣的原因,在小數浮點數中不能精確表示1 /3。)
在會計軟件中處理此問題的通常方法是將貨幣值表示為整數(例如,整數的美分)或十進制浮點數表示。 在Java中, BigDecimal
是表示十進制浮點數的標准方法。 它可以應付任意精度。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.