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

Php JS:如何添加增值税,然后扣除增值税,并返回到完全相同的原始价值?,php,javascript,math,accounting,Php,Javascript,Math,Accounting,我允许用户在库存中输入产品的价格,无论是净值还是总值。如果它们以总价输入价格,则在存储前计算它们的净值,并使用以下代码: var vatrate = 12; IsuppGross = parseInt(suppGross * 100); // makes it an integer // calc net var revVR = parseFloat('1.'+vatrate); Net = ( ( IsuppGross / revVR) / 100 ).toFixed(2); 我努力让它工

我允许用户在库存中输入产品的价格,无论是净值还是总值。如果它们以总价输入价格,则在存储前计算它们的净值,并使用以下代码:

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件相同的物品,其成本正好是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函数来实现这一点(或者我需要如何调整公式/将其转换为代码)

更新 @我认为雅库布走在正确的道路上。我找到了一种简单的方法来测试它,方法如下:

alert( (892.90 * 0.12).toFixed(2) );  // should equal 107.10
(仍然等于107.15)


以上内容基于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为基数的实数

检查此线程:


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

这实际上不是一个编程问题,而是一个数学问题。因为你特别要求一个公式,你可能想试试。我确实开始在那里回答我的问题,但后来因为我想包含一些代码供审查,我觉得可能是错误的受众,所以在发送之前转移到这里。我知道你是从哪里来的。对不起,你还是把数量和价格乘以增值税,然后四舍五入。你必须先将价格和增值税的乘积四舍五入,四舍五入,然后乘以数量。它必须是:
警报((10*(89.29*0.12).toFixed(2)).toFixed(2))我有点明白你的意思,但正如我前面提到的,如果系统以100美元的价格出售一件商品,我如何解释如果你购买10件商品,对客户来说是1000.05美元?我从来没有在商业系统中遇到过这样的差异,所以我认为一定有一个编码解决方案可以让我做正确的事情。因为我大部分工作时间都在英国,我会从英国的角度回答,但我认为整个欧盟都是这样的。如果你与企业打交道,你可以设定不含增值税的价格,并在最后加税。如果您与私人打交道,您可以设置价格(含增值税),并从发票总额中反算增值税。因此,在您的情况下,我将在全球范围内决定是否存储含增值税或不含增值税的价格,并在输入价格时进行四舍五入。我理解这一点。这就是我正在做的。我正在存储净价,并将发票底部的增值税添加到小计中。感谢您的输入。您说得很对,这似乎是一个“舍入”问题,而不是浮点错误,但尽管引入了
round()
并对其位置进行了调整,但我仍然无法使其正常工作。不过,我已经更新了我的问题,因为我们缩小了问题的范围。JS中的舍入函数是
Math.round
,它不接受第二个参数,所以我根据您的更新尝试了以下方法:
taxvalue=Math.round((小计*0.12)*100)/100小计为892.90。结果仍然是“107.15”(而不是“107.10”)。我想我所做的与你的公式不太相符?我已经将我的答案编辑成JS,我说的是一般的,不是任何特定的语言。谢谢。我现在明白了。这不是我想听到的,因为这意味着构建一些额外的循环以获得产品细分,因为我现在只有小计,但我现在“不顺利”!