JS:如何添加,然后扣除增值税,并回到完全相同的原始价值


JS: How to add, then deduct VAT and arrive back at EXACTLY the same original value?

我允许用户在库存中输入产品的价格,NET或Gross都可以。如果他们以Gross输入价格,则在存储之前为他们计算NET,并使用以下代码:

var vatrate = 12;
IsuppGross = parseInt(suppGross * 100); // makes it an integer
// calc net
var revVR = parseFloat('1.'+vatrate);
Net = ( ( IsuppGross / revVR) / 100 ).toFixed(2);

我努力让它工作,我不确定这是否是问题所在。

如果我输入'100.00'作为毛数,我的增值税税率是12%,它返回Net为'112.00',所以它似乎是工作的。

所以我输入一个毛价为100美元的产品,净价计算为89.29美元(我假设这是正确的)。

当为上述10个项目创建发票时,发票的底部看起来像这样:

Net Subtotal $892.90
VAT $107.15
Grand Total $1000.05

我期待的是:

Net Subtotal $892.90
VAT $107.10
Grand Total $1000.00

…,特别是当只出售上述其中之一时,结果是:

Net Subtotal $89.29
VAT $10.71
Grand Total $100.00

…的预期。因此,可以合理地假设,购买10件相同的物品,花费正好是原来的10倍。

这是我用来将增值税添加到净小计的公式:

数量×净价× 0.12 (10 × 89.29 × 0.12) = 107.148

以上四舍五入为107.15,加上净小计为1000.05。

当我重新添加增值税时,我需要什么公式才能到达1000 ?

总结/澄清这个公式……数量×净价× 0.12 (10 × 89.29 × 0.12)

给我107.148,但我认为我需要的是给我107.10

那么我可以使用什么javascript函数来实现这一点(或者我需要如何调整我的公式/将其转换为代码)?

@jakub走对了路。我发现了一种简单的测试方法,方法如下:

alert( (892.90 * 0.12).toFixed(2) );  // should equal 107.10

上面的内容是基于来自Jakub的输入。请注意,这里我没有单独乘以10,因为我注意到我们是在小计级别上工作的。

一种方法是将四舍五入放在另一个位置

round(quantity * price) != quantity * round(price)

增值税也是如此,将结果四舍五入与将一个产品的增值税四舍五入然后乘以数量略有不同。此外,你知道,该数量必须是整数,而不是浮点数(如果不是,则是另一种情况),因此在四舍五入后乘以应该不会产生更多的小数点。

我希望这对你有帮助。

好的,回应你的编辑:

你有

(quantity * price * VAT).toFixed(2) = (10 * 89.29 * 0.12).toFixed(2) = (107.148).toFixed(2) = 107.15

你应该有

quantity * (price * VAT).toFixed(2) = 10 * (89.29 * 0.12).toFixed(2) = 10 * (10.7148).toFixed(2) = 10 * 10.71 = 107.10

我认为我说的是正确的,法律立场是增值税发票金额必须是货物的正确百分比。服务的发票,所以不应该计算含增值税的项目价格。

我工作过的一个显示每行增值税的系统修改了最后一行的增值税金额以消除舍入错误。他们会一直在那里,除非你用5位小数点来显示你的价格(假设你的增值税税率是3位有效数字)。

这个问题的基本原因是计算机不能用浮点数表示大多数以10为基数的实数,因为计算机使用的是2为基数。

检查这个线程:为什么不使用Double或Float来表示货币呢?

所以第一步是始终使用整数作为货币,在这种情况下以分而不是美元来衡量,我想。