繁体   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