0

我正在一个网站上进行财务计算。valuta 的最佳实践是使用小数而不是浮点数,所以我知道这一点。计算完所有值后,我验证我的总计、子和增值税。

例如:我有以下值:

  • 总价:10.00
  • 增值税率:21%
  • 小计是:8.26
  • 增值税为:1.74

当我计算值时,这是输出。通过四舍五入出错的失败验证规则之一:

小计 * 增值税率应该得到总额

$calculateVatRate = ($vatRate + 100) / 100; // (21 + 100) / 100 = 1.21
$output = round($subTotal * $calculateVatRate, 2); //8.26 * 1.21 = 9.9946 -> round will 9.99 instead of 10.00

我试过:

有什么建议么?

-- 编辑舍入是 9.9946,我希望它应该是 10.00 或 10

4

2 回答 2

2

包含增值税的价格有两个组成部分。实际价格和增值税金额。

对于 21% 的比率,除以 1.21 是正确的,您需要检查的是如何舍入/截断(显然,有些人喜欢将后者称为“舍入为零”)。与负责该项目的会计师核实应如何处理计算的增值税金额。

一旦你破解了,不要再做任何乘法/除法或四舍五入。使用实际官方计算的增值税金额进行简单的加法/减法运算将为您提供所需的一切。有或没有四舍五入的乘法/除法会让你迷路,在这里和那里失去便士/美分,有时是“正确的”(但只是巧合)。

在您的系统外部接收发票金额(包括由发票人计算的增值税)时,有两种通用方法,我现在意识到您正在使用其中一种。

尽管增值税是一种标准计算方法,但允许任何给定公司进行计算的方法不止一种。这意味着您开具发票增值税的计算方式(舍入/截断)可能与您的会计师希望在您的系统中完成的方式不同,这对增值税人员来说是可以的。

您需要对发票上的增值税进行处理,将其作为事实处理,但您确实需要验证它是否正确,或者至少是合理的(您使用的方法)。

要验证发票增值税是否正确,您需要了解供应商如何计算其增值税。有效的方法数量有限,所以这并不像听起来那么复杂。在您的“供应商表”上,您有一个标志/指示器,说明它们是如何舍入的。一旦您知道这一点,您就可以绝对验证向您开具的增值税发票是否正确。

另一种方式是宽容。就我个人而言,我不喜欢这样,但在我最后工作的地方收到的发票就是这样处理的。货币单位的百分之一是所应用的容差。

如果您计算增值税并四舍五入到最接近的 100 个货币单位,您应该能够验证向您收取的增值税。在这一点上,再次,不要做更多的乘法/除法/舍入,而是酌情使用加法/减法。

我不知道 PHP 中小数的四舍五入是如何工作的。

24 / 1.21 = 19.8347 到小数点后四位。= 19.834 到小数点后三位(截断中间结果)

如果您手动将第一位四舍五入到小数点后两位,您将得到 19.84。如果你对第二个进行舍入,你会得到 19.83。

虽有所不同,但仍在承受范围之内。但是,如果您乘法/除法/四舍五入,您可能会损失 0.02(如果您的代码与供应商的代码不符)。

于 2016-01-05T00:26:03.860 回答
0

在计算增值税百分比或小计金额时,您会产生舍入误差。如果您的小计为 8.26,增值税为 1.74,则您的增值税率为 21.06% 而不是 21%。

$calculateVatRat = 10 / 8.26; // 1.2106

如果您希望结果准确,则需要在此处考虑小数。

$output = round($subTotal * $calculateVatRate, 2); // 9.9999 rounded as 10.00.

但是,如果您希望增值税率为 21%,那么您需要为小计增加额外的数字以保持计算准确。

$subTotal = 8.2645; 
$calculateVatRat = 1.21; // 10 / 8.2645
$output = round($subTotal * $calculateVatRate, 2); // 9.9999 rounded as 10.00.

现在,如果您不能显示 4 位数字,则需要保留单独的值以进行显示和计算。

更好的是,始终将原始计算值保留在变量中(不进行任何舍入)。仅在显示时对每个变量进行四舍五入(保持变量不变)。

$subTotal = 10/1.21; //8.264462809917355
$vatTotal = 10 - $subTotal; // 1.735537190082646
$output = $subTotal * $calculateVatRate; //10
$subTotalDisplay = round($subTotal, 2); //8.26
$vatTotalDisplay = round($vatTotal, 2); //1.74
$outputDisplay = round($output, 2); //10.00
于 2016-01-05T00:12:20.620 回答