2014-08-29 3 views
1

Так что я не могу понять, что здесь не так. Я пытаюсь рассчитать налог с продаж в общую сумму. Я пытаюсь получить две переменные здесь:PHP Налог с продаж Расчет

A. The total amount of sales tax that is being charged (i.e. $0.61 for sales tax) 
B. The Grand total including the item price times the quantity plus the sales tax. 

Мой сценарий, как показано ниже, так, как я это настроить прямо сейчас это только добавляет пенни к общей югу. (Вместо $ 7,00 общая сумма составляет $ 7,01)

Если суб общее после каждого пункта $7.00 и налоговая ставка 8.650% то налог общая сумма должна быть $0.61 и общая сумма должна быть $7.61, но это делает его $7.01 вместо этого.

public function invoice_totals($invoice_id) 
{ 
    $query = $this->CI->db->select('*'); 
    $query = $this->CI->db->from('invoice_to_items'); 
    $query = $this->CI->db->where('invoice_id', $invoice_id); 
    $query = $this->CI->db->join('items', 'items.item_id = invoice_to_items.item_id'); 
    $query = $this->CI->db->get(); 
    $items = $query->result(); 

    $sub_total  = '0.00'; 
    $grand_total = '0.00'; 
    $tax_rate  = '0.0865'; 
    $tax_total  = '0.00'; 

    foreach($items as $item) 
    { 
     $sub_total = $sub_total + ($item->item_price*$item->item_qty); 

     $tax_total = $tax_total + ($sub_total * $tax_rate)/100; 
    } 

    $grand_total = $grand_total + $sub_total + $tax_total; 

    return array(
     'sub_total'  => number_format($sub_total,2), 
     'tax_total'  => number_format($tax_total, 2), 
     'grand_total' => number_format($grand_total,2), 
    ); 
} 

Основная линия меня интересует в этом вопросе:

$tax_total = $tax_total + ($sub_total * $tax_rate)/100; 
+4

Удалить деление на 100, ваши $ TAX_RATE уже в десятичной форме. Кроме того, инициализируйте свои переменные числами, а не строками. –

+1

Ну, тогда вы, вероятно, не должны внедрять что-то, что может предположительно даже иметь юридические последствия, если это сделано неправильно ... – CBroe

+0

@ user3968645 Прошу прощения, но вы говорите об этом, но программирование и математика идут рука об руку. Если вы не можете выполнять основные математические операции, ваше будущее как программиста выглядит мрачным. –

ответ

3

вы подаете ваши налоги на ваш итога на каждой итерации цикла.

допустим есть 3 пунктов: $ 5, $ 15, $ 40

loop #1: 

subtotal = 0 + ($5 * 1) = $5 
total = 0 + ($5 + 8.65%) = $5.43 

loop #2: $5.43 + ($15 * 1) = $20.43 
total = $5.43 + ($20.43 + 8.65%) = etc... 

etc... 

ваш # 2 пункта теперь дважды облагаться налогом первого пункта, и ваш третий пункт будет TRIPLE таксировать первый элемент и DOUBLE обложения второй предмет и т. д.

Кроме того, ваше значение ставки налога УЖЕ десятичное (0.0865), но вы делаете деление/100, как будто у вас есть $tax_rate = 8.65. Таким образом, фактически ваша ставка налога действительно 0,0865%

Ваш цикл должен быть:

$taxrate = 8.65; // % value 

foreach($items as $item) { 
    $item_sub = $items->quantity * $items->price; 
    $item_total = $item_sub * ($taxrate/100); 

    $grand_total = $grand_total + $item_total; 
} 
+0

Также он должен определить ставку налога как float, а не как строку. –

+0

@CharlotteDunois: php в этом случае не волнует. –

+0

В этом случае PHP преобразует его в float, но делает это сто раз, и вы заметите это, если вы тестируете среду выполнения. –

Смежные вопросы