2014-02-20 6 views
0

У меня проблема с вычислением на PHP. Выходное эхо имеет неправильное значение. Например, эхо с 3500 должно быть 475. Вместо этого я получаю 525? Где я ошибаюсь?Неверный вывод после вычисления PHP

Я пытаюсь создать систему для расчета платы за обслуживание. Плата будет автоматически генерироваться суммой. Для первой части 2500 евро плата за обслуживание составит 15%. Для второй части (от 2500 до 5000) плата будет составлять 10% и т. Д. Я написал следующий код, но мой вывод (эхо) неверен. Без exit; он просто продолжает цикл. Что не так в моем коде? У кого-нибудь есть предложение. Я PHP-новичок BTW, поэтому любая помощь будет оценена!

<? 

### Sum ### 
$som = 3500; // example sum 3500 (2500 first part 15%/1000 second part 10%) 

/* Output should be with 3500 : 
15% of 2500 = 375 + 10% of 1000 = 100 (part above 2500) TOTAL of 475. 
My output is 525??? :s */ 


### 15% first 2500 ### 
if ($som < 2500); { 
$uitkomst = $som/100 * 15; 
echo $uitkomst; 
exit; } 

### 10% between 2500 - 5000 ### 
if ($som >2500 && $som < 5000); { 
$iv1 = 2500/100 * 15; 
$ts = $som - 2500; 
$iv2 = $ts/100 * 10; 
$iv1 + $iv2 = $uitkomst; 
echo $uitkomst; 
exit; } 

### 5% between 5000 - 10.000 ### 
if ($som >5000 && $som <10000); { 
$iv1 = 2500/100 * 15; 
$iv2 = 2500/100 * 10; 
$ts = $som - 5000; 
$iv3 = $ts/100 * 5; 
$iv1 + $iv2 + $iv3 = $uitkomst; 
echo $uitkomst; 
exit; } 

### 1% between 10.000 and 200.000 ### 
if ($som >10000 && $som <200000); { 
$iv1 = 2500/100 * 15; 
$iv2 = 2500/100 * 10; 
$iv3 = 5000/100 * 5; 
$ts = $som - 10000; 
$iv4 = $ts/100 * 1; 
$iv1 + $iv2 + $iv3 + $iv4 = $uitkomst; 
echo $uitkomst; 
exit; } 

### 0.5% over 200.000 ### 
if ($som >200000); {  
$iv1 = 2500/100 * 15; 
$iv2 = 2500/100 * 10; 
$iv3 = 5000/100 * 5; 
$iv4 = 190000/100 * 1; 
$ts = $som - 200000; 
$iv5 = $ts/100 * 0.5; 
$iv1 + $iv2 + $iv3 + $iv4 + $iv5 = $uitkomst; 
echo $uitkomst; 
exit; } 
?> 
+0

Вы говорите, что ваш скрипт продолжает работать навсегда без выхода? Можете ли вы разместить свою конструкцию цикла, пожалуйста? – Kyle

+3

Ваш запрос $ uitkomst обратный.Левому операнду присваивается значение выражения справа. – lwitzel

+0

Это выглядит ужасно и сложно поддерживать, вы должны иметь ассоциативный массив, связывающий суммы с процентами, и использовать цикл while, вычитая суммы, пока не достигнете '0'. Теперь вы много повторяетесь, и изменение процента или суммы потребует много изменений кода. – jeroen

ответ

1

В коде есть несколько неправильных вещей.

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

$uitkomst = 0; //you need to add this. 
if ($som < 2500); { 
$uitkomst = $som/100 * 15; 

следующий вопрос заключается в том, что ваша переменная присваивание в обратном направлении, РНР слева направо, а не справа налево, в следующем операторе вы присваиваете значение $uitkomst для $iv2 и $iv2

$iv1 + $iv2 = $uitkomst; 

Что должно быть:

$uitkomst = $iv1 + $iv2; 

И что корректировка должна быть в нескольких местах вашего кода.

И, наконец, у вас есть ;, это след после ваших условных заявлений. Хотя я даже не знаю, как это функционирует на всех, они должны быть удалены:

if ($som >10000 && $som <200000); { 

должен быть изменен на:

if ($som >10000 && $som <200000){ 

И что корректировка должна быть в нескольких местах ваш код.

+0

Спасибо за решение, ваше решение решило проблему – user3334594

0
$iv1 + $iv2 = $uitkomst; 

Проблема в том, что это: $ uitkomst = $ iv1 + $ iv2; потому что в php и на другом языке назначение: $ var = val; а не наоборот ... и я предлагаю вам использовать ElseIf и сделать эхо, после ELSEIF и после того, как сделать выход ...

+0

Спасибо за ваш комментарий. Это поможет мне улучшить мои навыки PHP. – user3334594

1

Ваши если заявления являются пустыми:

if ($som >2500 && $som < 5000); 

потерять ';'

Кроме того, сделайте привычку прилагать тесты в скобках, например.

if(($som >10000) && ($som <200000)) 
+0

Спасибо, я буду помнить это в следующий раз. Я только начинаю с PHP, поэтому я предлагаю помощь. – user3334594

1

Вот вам лучший подход. Добавьте столько правил, сколько захотите.

<?php 

### Sum ### 
$som = 3500; // example sum 3500 (2500 first part 15%/1000 second part 10%) 

$rules = array(
    // lower bound => array( 
    // 'percent' => percent to charge for this rule, 
    // 'upper' => upper bound for this rule 
    //) 
    0 => array('percent' => 0.15, 'upper' => 2500), 
    2500 => array('percent' => 0.10, 'upper' => 5000), 
    5000 => array('percent' => 0.05, 'upper' => 10000), 
    10000 => array('percent' => 0.01, 'upper' => 200000), 
    200000 => array('percent' => 0.005, 'upper' => null), 
); 

$fee = 0; 
$toCalculate = $som; 
foreach($rules as $lower => $rule) { 
    // If there's nothing left to calculate, break 
    if($toCalculate <= 0) break; 

    $rule['upper'] = $rule['upper'] ? $rule['upper'] : $toCalculate; 

    // Amount to apply the current fee percent to 
    $current = min($rule['upper'], $toCalculate); 

    // Add fee generated by current rule 
    $fee += $rule['percent'] * $current; 
    $toCalculate -= $current; 
} 

echo 'Fee: ' . $fee; 
+0

Хорошая работа. Побей меня. Я написал десятичный -> римский цифровой конвертер, который работает очень похоже. – Kyle

+2

Спасибо за это решение. Это отлично работает и сохраняет код чистым. Я изучу ваш код, чтобы улучшить свои навыки PHP – user3334594

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