从总金额计算小计和增值税

时间:2016-01-04 23:52:52

标签: php compare calculator financial money-format

我正在一个网站上进行财务计算。 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

2 个答案:

答案 0 :(得分:1)

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

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

一旦你破裂了,就不要做任何更多的乘法/除法或舍入。简单的加法/减法与实际官方计算的增值税金额将为您提供所需的一切。有或没有四舍五入的乘法/除法会让你迷失方向,在这里和那里失去便士/美分,有时候是"正确的" (但只是巧合)。

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

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

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

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

另一种方式是宽容。就个人而言,我不喜欢这样,但它是我在最后一个地方收到的发票的方式。百分之一的货币单位是适用的容忍度。

如果您计算增值税并将其舍入到最接近货币单位的第100位,您应该能够验证向您收取的增值税。此时,再次,不要进行更多的乘法/除法/舍入,而是适当地使用加法/减法。

我不知道如何在PHP中舍入小数。

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

如果您手动将第一个小数点后两位数舍入,则得到19.84。如果你绕过第二个,那么你得到19.83。

虽然不同,仍然在宽容范围内。但是,如果您乘以/除/绕两次,则可能为0.02(如果您的代码不符合供应商的代码)。

答案 1 :(得分: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