[英]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.