2016-01-04 11 views
0

Я работаю над веб-сайтом для финансовых расчетов. Лучшая практика для valuta - использование десятичных знаков и никаких поплавков, поэтому я знаю об этом. Когда все значения были рассчитаны, я проверяю свою общую сумму, суб и НДС.Подсчитать итоговое значение и НДС от общей суммы

Например: У меня есть следующие значения:

  • Totalprice: 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 

Я попытался с:

любые предложения?

- Edit Округление 9,9946, я ожидаю, что это должно быть 10,00 или 10

+0

Мне нужно посмотреть, есть ли у меня его, для вашего примера вам нужен выход: ставка НДС: 21% НДС: $ 2.1. Итого: $ 7.9, правильно? –

+0

@AngeloBerzacola Всего 10,00, промежуточный итог должен быть 8,26, НДС - 1,74 по ватрату 21%. Чтобы быть ясным, 8.26 = 100%, 1.74 = 21%, 10.00 = 121% –

+0

@BillWoodger да, мы работаем с 2 цифрами не четыре :) его деньги. –

ответ

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 
+0

Ставки НДС являются фиксированными числами, продиктованными правительствами. Вы не можете просто использовать другое, когда цифры не видны. –

+0

Привет, Tareq, спасибо за ваш ответ. Я знаю об 1.2106, но если мой промежуточный итог уже 2 цифры, а мой ватрат также 2 цифры, как возможно, что 4-я цифра создает проблемы? –

+0

@ eL-Prova 4-я цифра вызовет проблемы, потому что у вас есть округление при подсчете суммарного итога, подождите минуту. Я редактирую ответ. –

1

Ценовое включая НДС состоит из двух компонентов. Фактическая цена и сумма НДС.

Для ставки 21%, разделите на 1.21 правильно, что вам нужно проверить, как округлить/усечь (некоторые люди любят называть последнее «раундом до нуля», по-видимому). Проконсультируйтесь с бухгалтером, ответственным за проект, о том, как следует обрабатывать расчетную сумму НДС.

Как только у вас есть трещины, не делайте больше размножения/деления или округления любого вида. Простое сложение/вычитание с фактической официальной расчетной суммой НДС доставит вам все, что вам нужно. Умножение/деление с округлением или без него приведет к потере, потере копейки/центами здесь и там и иногда «правильному» (но только по совпадению).

При получении суммы счета-фактуры, которая включает НДС, вычитаемый счетчиком, внешний для вашей системы, есть два общих подхода, один из которых я теперь понимаю, что вы используете.

Несмотря на то что НДС является стандартным расчетом, существует более чем один способ, которым любая данная компания может выполнять расчет. Это означает, что вы выставили счет НДС для может быть рассчитан (округление/усечение) иначе, чем ваш бухгалтер хочет сделать это в вашей системе, и это нормально с людьми с НДС.

Что вам нужно сделать с НДС в счете-фактуре, это процесс как факт, но вам нужно проверить, что оно является правильным или, по крайней мере, разумным (подход, который вы используете).

Чтобы убедиться, что выставленный на счете НДС указан правильно, вам нужно знать, как поставщик рассчитывает свой НДС. Существует ограниченное количество способов, которые являются действительными, поэтому это не так сложно, как кажется. На вашей «таблице поставщиков» у вас есть флаг/индикатор, который говорит, как они крутятся. Как только вы это знаете, вы можете абсолютно точно убедиться, что выставленный вам НДС является правильным.

Другим способом является толерантность. Лично мне это не нравится, но так оно и было сделано для счетов-фактур, полученных на последнем месте, где я работал. Одной из единиц валюты была толерантность, которая применялась.

Если вы подсчитаете НДС и округлите до ближайшей 100-й единицы валютной единицы, вы сможете проверить НДС, начисляемый на вас. В этот момент, опять же, не делайте больше умножения/деления/округления, но при необходимости используйте сложение/вычитание.

Я понятия не имею, как работает округление десятичных знаков в PHP.

24/1.21 = 19.8347 до четырех знаков после запятой. = 19.834 до трех знаков после запятой (усечение промежуточного результата)

Если вы обмениваете первые до двух знаков после запятой, вручную, вы получите 19.84. Если вы обойдете второе, вы получите 19.83.

Хотя разные, все еще в пределах допуска. Однако, если вы умножаете/делите/раунд дважды, вы можете быть 0.02 out (если ваш код не совпадает с кодом поставщика).

+0

Билл, это другой способ, который я пытался сделать. В моем случае я импортирую счета-фактуры, поэтому цена является точной, 0,01 разница разрешена, больше бросает предупреждение для проверки :-) –

+0

@ eL-Prova Wow. Я знаю бухгалтера, который доводил до 10-миллионного отчета на каждую встречу, чтобы подчеркнуть, что он оставил держатель за одну сотую разницу в валютной единице. Это было на торгах в международном банке. У него была бы полная корова при мысли о том, чтобы быть 0,01 с ценой в десять долларов. Поскольку его здесь нет, у меня есть корова от его имени :-) –

+0

Другими словами, нет оправдания для точности менее 100%. По крайней мере, нет хорошего оправдания. Ваш сайт может быть сорван за 0.01 валюты за транзакцию, и никто не знает об этом. Ваша отчетность по НДС может быть отключена (и это * никогда * хорошо). Он выглядит дрянным и смущает клиентов. –