Andy Lanng Ответов: 1

Как рассчитать сумму из цены + налог?


Я пытаюсь рассчитать американский налог. Магазин во Флориде вызывает у меня головную боль.

Существует государственный налог в размере 6% и городской налог в размере 1%, но только на первые 5000 долларов

Легко вычислить налог от цены:

var total = taxRates.sum(t=>t.rate * Math.Min(t.MaxAmount??Price, Price))


Это работает со всеми налоговыми ставками и типами. Британский налог, например. в списке TaxRates будет только 1 налоговая ставка, а MaxAmount будет равен нулю.

Проблема в нем. У меня есть сумма, включающая налог, и я должен придумать единый для всех метод расчета цены за вычетом налога.

Есть идеи?

Что я уже пробовал:

В настоящее время я разрабатываю пороговое значение ставки и повторяю ее:

Рассмотрим следующий пример для Флориды:

Max Amount       Rate
5000             1%
null             6%
null             1%   (a fake locality tax for this demo)


первые 5000 долларов будут облагаться налогом в размере 8% от общей суммы. Я определяю сумму, которую облагает налогом каждый "уровень", и создаю налоговые диапазоны таким образом:

Max Amount       Rate
5000             8%
null             7%   (rates with the same maxamount are aggregates)


Теперь я могу сказать порог группы:

Rate     Threshold          Before Tax
8%       5400               5000
7%       decimal.MaxValue   null


так что теперь я могу повторить этот список, чтобы найти фактическую сумму налога.

Допустим, у нас есть 2700 долларов. Это не выше первого налогового диапазона, так что все это облагается налогом в размере 8%. 2700 / 1.08 = $2500

10000: это больше 5400, поэтому 5400 облагается налогом в размере 8%:
4600: это в пределах следующей полосы, так что все облагается налогом в 7%
= 5000 + (4600 / 1.07)

Это работает, но очень неуклюже.

Richard MacCutchan

Как 2700 плюс 8% налог равняется 2500? Точно так же ваш последний расчет не выглядит правильным.

Andy Lanng

первый:
2500 + 8% = 2700
так
2700 / 1.08 = 2500, что я и написал
второй :
таким образом, 5400 из общего числа были 5000, взимаемыми под 8%. Это означает, что 5400 из 10000 были учтены.
это выходит 4600, которая должна быть учтена на следующий налоговый кронштейн

Richard MacCutchan

Я думал, что вы начинаете с чистых сумм для расчета налога.

Andy Lanng

начиная с цены + налог. Мне нужно узнать цену. Если я знаю налог (то есть 8%), то для получения цены мне нужно только разделить ее на 1,08.
Проблема в том, что когда существует ограничение на то, к какой сумме применяется налог в размере 1%, общий налоговый % будет где-то между 7 и 8 %

Richard MacCutchan

По моему опыту покупок в США они всегда показывают чистую цену и добавляют налог в кассу. А во Флориде все по-другому?

Andy Lanng

Флорида ничем не отличается. Это мой клиент.

Richard MacCutchan

Я всегда думал, что без клиентов наша работа была бы намного проще.

Andy Lanng

^_^

MadMyche

Это для физического магазина или там будет задействована доставка?

Andy Lanng

К счастью, никакой доставки ^_^

1 Ответов

Рейтинг:
0

#realJSOP

double amt = 5400d;
double stateTax = 6d;
double cityTax = 1d;
double cityTaxableAmnt = 5000d;
double stateTaxableAmt = double.MaxValue;

double stateTaxAmt = Math.Min(amt, stateTaxableAmt) * (stateTax * 0.01);
double cityTaxAmt  = Math.Min(amt, cityTaxableAmt) * (cityTax * 0.01);
total = amt + stateTaxAmt + cityTaxAmt;


Я оставлю это как упражнение для программиста, чтобы заставить этот код работать независимо от штата или страны. Кроме того, я бы использовал decimal типы в производственном коде, потому что математика с плавающей запятой-это просто приближение, где десятичная математика гораздо более точна..


Andy Lanng

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

#realJSOP

Ну, не каждый государственный орган реализует одно и то же налоговое определение. Ты будешь писать код вечно. К сожалению, вы должны знать все налоговые коды, прежде чем сможете разработать иерархию классов или схему базы данных для ее обработки.