-1

我允许用户以 NET 或 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.00 美元的产品,净价计算为“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 件相同物品的成本恰好是其十倍。

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

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

然后将上述四舍五入为 107.15,将其添加到净小计为 1000.05。

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

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

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

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

更新 @jakub 我认为是在正确的轨道上。我找到了一种简单的方法来测试它,方法是:

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

(仍然等于 107.15)

以上内容基于 Jakub 的输入,如下所示。请注意,我在这里没有单独乘以 10,因为我注意到我们正在小计级别工作。

4

3 回答 3

2

一种方法是将舍入放在不同的地方

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
于 2013-03-25T13:17:19.733 回答
1

我认为我的说法是正确的,法律立场是开具发票的增值税金额必须是开具发票的商品和服务的正确百分比,因此不应将含增值税的项目价格相加。

我使用的一个系统显示每行的增值税修改了最后一行的增值税金额以消除舍入错误。除非您以 5 位小数显示价格(假设您的增值税税率为 3 位有效数字),否则它们将始终存在。

于 2013-03-25T13:32:14.563 回答
0

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

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

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

于 2013-03-25T13:41:35.140 回答