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

вот:


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

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

но опять же цена может быть и без скидки в цене
а скидка например 2000 внизу может быть.
29.08.2014 13:33
vdm
 
Все равно без исходных данных непонятно.
Тебе же дали направление движения - выведи промежуточные расчеты на экран.
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
KirillHome
 
Скорее всего происходит следующее:
1) Вычисляется абсолютная скидка
2) Вычисляется процент, который составляет абсолютная скидка
3) Данный процент заново применяется к цене без скидки.

И я не уверен, что процент хранится до хотя бы 4 знаков после запятой.
Отсюда и расхождение (вместо скидки в 2000 получается скидка в 1998,947.....).
29.08.2014 16:26
vdm
 
Топикстартер темнит...
Т.к. по его же словам разница там между 26200 и 26221.052631579.
Т.е. не рубль, а 21р.
29.08.2014 16:33
KirillHome
 
Ну, если посчитать округление до двух знаков, то у меня вообще получилось 26 :)
Вложения
Тип файла: xls Тест округления.xls (5.5 Кб, 164 просмотров)
30.08.2014 19:20
aldemko
 
возможно обсчитался. в заботах весь был
и не заметил разницы
да 21 с копейками разница (
30.08.2014 23:40
KirillHome
 
Так что с промежуточными расчётами?
31.08.2014 15:28
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 ровно считают
а дальше идут с точками
31.08.2014 16:58
aldemko
 
Цитата:
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
vdm
 
Переделано.
Доп. скидки на фиксированную сумму считаются по-своему.
Для процентных добавлено округление до 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, время: 09:13.

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