在使用两点精度(Java)格式化浮点数时保持准确性

时间:2016-08-21 04:07:21

标签: java

这是该计划。这意味着根据工作小时数,小时费率,税收预扣等计算员工的净工资。它计算正确,但双点精确格式舍入最后一个小数,丢失计算&#39准确性。

示例输入:

姓名:史密斯
本周工作时间: 10
每小时费率: 6.75
联邦税扣留: 20%
州税收: 9%

输出:

摘要

员工:史密斯
总薪酬: 67.50
联邦预扣税: 13.50
国家预扣税: 6.08
扣除总额: 19.58
净工资: 47.93

$('a.nav.icon.More').trigger('click');

}

请怜悯;我是第一年。

1 个答案:

答案 0 :(得分:0)

  

格式化浮点数以便以两点精度显示时保持精度

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

你说:

  

它计算正确,但双点精度格式舍入了最后一个小数,失去了计算的准确性。

这是正确的。浮点计算可能精确到至少10个小数点。如您所知,当您使用%.2f调用中的printf格式化数字时,实际上会发生精度损失(舍入)。

简单地说,你不能保持准确性"并且只用2个小数精度打印出数字。

简单的解决方案是在小数位后打印更多数字;即为号码使用不同的格式说明符。 (例如...... %.4f会给出小数点后的4位数!)

我建议您阅读Formatter的{​​{3}},其中解释了格式说明符的含义。

实际上,还有第二种方式来看待这个问题。您在此处使用double进行计算。 double是二进制(base-2)浮点表示。许多十进制数不能在二进制浮点中精确表示。 (出于同样的原因,1/3在十进制浮点中无法精确表示。)

在会计软件中处理此问题的正常方法是将货币值表示为整数(例如,整数个分数)或十进制浮点表示。在Java中BigDecimal是表示十进制浮点的标准方法。它可以应付任意精度。