29.08.2014 11:34
Параметры скидки

вот:


но это те-же скидки что и выше, они реализованы через pricegd

28200 это уже со скидкой которую вы мне помогали делать через pricegd вывести ен скидку а сформировать цену. скрипт выше

но опять же цена может быть и без скидки в цене
а скидка например 2000 внизу может быть.
29.08.2014 13:33
Все равно без исходных данных непонятно.
Тебе же дали направление движения - выведи промежуточные расчеты на экран.
SQL код:
        if ($arResult['DISCOUNTS']['sklad_s'][$i] == "Владивосток") 
        { 
            echo "<span style='font-weight:bold; font-size: 15px;'>&nbsp;osn_price2 = <span style='font-weight:bold; font-size: 16px;'>".$osn_price2."</span></span><br>"; 
            echo "<span style='font-weight:bold; font-size: 15px;'>&nbsp;disc = <span style='font-weight:bold; font-size: 16px;'>".$disc."</span></span><br>"; 
            echo "<span style='font-weight:bold; font-size: 15px;'>&nbsp;disc2_percent = <span style='font-weight:bold; font-size: 16px;'>".$disc2_percent."</span></span><br>"; 
            echo "<span style='font-weight:bold; font-size: 15px;'>&nbsp;disc2 = <span style='font-weight:bold; font-size: 16px; '>".$disc2."</span></span><br>"; 
            echo "<span style='font-weight:bold; color:#00A80D; font-size: 15px;'>&nbsp;&nbsp;Цена со скидкой <span style='font-size: 16px;' >".$type_s_out."</span> во Владивостоке: <span style='font-weight:bold; font-size: 16px; color: #FA8C00;'>".$price2." руб.</span></span><br>"; 
        } 
29.08.2014 15:06
Скорее всего происходит следующее:
1) Вычисляется абсолютная скидка
2) Вычисляется процент, который составляет абсолютная скидка
3) Данный процент заново применяется к цене без скидки.

И я не уверен, что процент хранится до хотя бы 4 знаков после запятой.
Отсюда и расхождение (вместо скидки в 2000 получается скидка в 1998,947.....).
29.08.2014 16:26
Топикстартер темнит...
Т.к. по его же словам разница там между 26200 и 26221.052631579.
Т.е. не рубль, а 21р.
29.08.2014 16:33
Ну, если посчитать округление до двух знаков, то у меня вообще получилось 26 :)
Вложения
Тип файла: xls Тест округления.xls (5.5 Кб, 167 просмотров)
30.08.2014 19:20
возможно обсчитался. в заботах весь был
и не заметил разницы
да 21 с копейками разница (
30.08.2014 23:40
Так что с промежуточными расчётами?
31.08.2014 15:28
HDD на компе помер.
проверил другие товары.
парочка:
Цена: 31000 руб.
29019.169329073 руб.

Цена: 31400 руб.
29418.927444795 руб.

Цена: 32300 руб.
Цена со скидкой во Владивостоке: 30318.404907975 руб.


как видно, ценна со скидкой везде плавает и суммы разные получаются

дальше за испытуемую карточку вял вот
товар:
Цена: 32300 руб.
Цена со скидкой во Владивостоке: 30318.404907975 руб.

после подставил код промежуточных данных
вышла такая картина


Цена: 32300 руб.
osn_price2 = 32600
disc = 300
disc2_percent = 6.1349693251534
disc2 = 281.59509202454
Цена со скидкой во Владивостоке: 30318.404907975 руб.


osn_price2 и disc ровно считают
а дальше идут с точками
31.08.2014 16:58
Цитата:
aldemko HDD на компе помер.
проверил другие товары.
парочка:
Цена: 31000 руб.
29019.169329073 руб.

Цена: 31400 руб.
29418.927444795 руб.

Цена: 32300 руб.
Цена со скидкой во Владивостоке: 30318.404907975 руб.


как видно, ценна со скидкой везде плавает и суммы разные получаются

дальше за испытуемую карточку вял вот
товар:
Цена: 32300 руб.
Цена со скидкой во Владивостоке: 30318.404907975 руб.

после подставил код промежуточных данных
вышла такая картина


Цена: 32300 руб.
osn_price2 = 32600
disc = 300
disc2_percent = 6.1349693251534
disc2 = 281.59509202454
Цена со скидкой во Владивостоке: 30318.404907975 руб.


osn_price2 и disc ровно считают
а дальше идут с точками
вся разгадка здесь
1:
$type_s_out = "";
$disc2_percent = ( ($osn_price2-$arResult['DISCOUNTS']['skid'][$i])/$osn_price2 ) * 100;
$disc2 = $disc - ( ($disc * $disc2_percent) / 100 );
$price2 = $arResult['DISCOUNTS']['skid'][$i] - $disc2;

но как можно повлиять на этот алгоритм, что бы числа ровными были
31.08.2014 17:42
Переделано.
Доп. скидки на фиксированную сумму считаются по-своему.
Для процентных добавлено округление до 10р.
код:

SQL код:
<? 
if (!defined("B_PROLOG_INCLUDED") || B_PROLOG_INCLUDED!==true) die(); 

//echo $arResult['DISCOUNTS']['col']; 
/*echo "<pre>"; 
print_r ($arResult['DISCOUNTS']); 
echo "</pre>";*/ 

$osn_price = $arResult['DISCOUNTS']['price_osn'][''] + 0;//это ноль прибавлен доля того, чтобы из 5000.00 стало 5000 (убрали .00) 
$disc = 0; 
$osn_price2 = $osn_price; 
$round_prec = -1; // округление до 10р

if ($arResult['DISCOUNTS']['price_osn'][''] != "") 
{ 
    for($i = 0; $i < $arResult['DISCOUNTS']['col']; $i++) 
    { 
        if ($arResult['DISCOUNTS']['dnk_s'][$i] == $arResult['DISCOUNTS']['dnk_out'][$i]) 
        { 
            if ($arResult['DISCOUNTS']['sklad_s'][$i] == "") 
            { 
                $disc = $osn_price2 - $arResult['DISCOUNTS']['skid'][$i]; 
                $osn_price = $arResult['DISCOUNTS']['skid'][$i]; 
                break; 
            } 
        } 
    } 

    echo '<div class="item_current_price" id="">Цена: '.$osn_price.' руб.</div><br>'; 
} 
else 
{ 
    echo '<div class="item_current_price" id="">Цена: по запросу</div><br>'; 
} 

for($i = 0; $i < $arResult['DISCOUNTS']['col']; $i++)//погнали скидки выводить 
{ 
    if ($arResult['DISCOUNTS']['dnk_s'][$i] == $arResult['DISCOUNTS']['dnk_out'][$i] && $arResult['DISCOUNTS']['price_osn'][''] != "") 
    { 
        $type_s_out = ""; 
        if ($arResult['DISCOUNTS']['type_s'][$i] == "Процент") 
        { 
            $type_s_out = $arResult['DISCOUNTS']['val_s'][$i]."%";
            $disc2_percent = ( ($osn_price2-$arResult['DISCOUNTS']['skid'][$i])/$osn_price2 ) * 100;
            $disc2 = $disc - ( ($disc * $disc2_percent) / 100 );
            $price2 = round($arResult['DISCOUNTS']['skid'][$i] - $disc2, $round_prec);
        }
        else
        {
            $disc2 = $osn_price2-$arResult['DISCOUNTS']['skid'][$i];
            $price2 = $osn_price - $disc2;
        } 

        if ($arResult['DISCOUNTS']['sklad_s'][$i] == "Под заказ") 
        { 
            echo "<span style='font-weight:bold; color:#00A80D; font-size: 15px;'>&nbsp;&nbsp;Под заказ, цена со скидкой: <span style='font-weight:bold; font-size: 16px; color: #FA8C00;'>".$price2." руб.</span></span><br>"; 
        } 

        if ($arResult['DISCOUNTS']['sklad_s'][$i] == "Владивосток") 
        { 
            echo "<span style='font-weight:bold; color:#00A80D; font-size: 15px;'>&nbsp;&nbsp;Цена со скидкой <span style='font-size: 16px;' >".$type_s_out."</span> во Владивостоке: <span style='font-weight:bold; font-size: 16px; color: #FA8C00;'>".$price2." руб.</span></span><br>"; 
        } 

        if ($arResult['DISCOUNTS']['sklad_s'][$i] == "Москва") 
        { 
            echo "<span style='font-weight:bold; color:#00A80D; font-size: 15px;'>&nbsp;&nbsp;Цена со скидкой <span style='font-size: 16px;' >".$type_s_out."</span> в Москве: <span style='font-weight:bold; font-size: 16px; color: #FA8C00;'>".$price2." руб.</span></span><br>"; 
        } 

//        if ($arResult['DISCOUNTS']['sklad_s'][$i] == "") 
//        { 
//            echo "<span style='font-weight:bold; color:#00A80D; font-size: 15px;'>&nbsp;&nbsp;Цена со скидкой: <span style='font-size: 16px;' >".$type_s_out."</span> <span style='font-weight:bold; font-size: 16px; color: #FA8C00;'>".$price2." руб.</span></span><br>"; 
//        } 

        if ($arResult['DISCOUNTS']['comment'][$i] != "") 
        { 
            echo "<span style='font-style: italic; color:#000; font-size: 12px;'>&nbsp;&nbsp;&nbsp;".$price2."</span><br>"; 
        } 


    } 

} 

?>
Часовой пояс GMT +3, время: 07:00.

Форум на базе vBulletin®
Copyright © Jelsoft Enterprises Ltd.
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.