За последние 24 часа нас посетили 17735 программистов и 1921 робот. Сейчас ищут 1028 программистов ...

много девяток после точки

Тема в разделе "JavaScript и AJAX", создана пользователем GudGuy, 16 май 2011.

  1. GudGuy

    GudGuy Активный пользователь

    С нами с:
    14 июн 2007
    Сообщения:
    909
    Симпатии:
    0
    Адрес:
    Москва
    [js]function print_r(arr, level) {
    var print_red_text = "";
    if(!level) level = 0;
    var level_padding = "";
    for(var j=0; j<level+1; j++) level_padding += " ";
    if(typeof(arr) == 'object') {
    for(var item in arr) {
    var value = arr[item];
    if(typeof(value) == 'object') {
    print_red_text += level_padding + "'" + item + "' :\n";
    print_red_text += print_r(value,level+1);
    }
    else
    print_red_text += level_padding + "'" + item + "' => \"" + value + "\"\n";
    }
    }

    else print_red_text = "===>"+arr+"<===("+typeof(arr)+")";
    return print_red_text;
    }





    $(document).ready(function(){
    var price_big;
    var format=$('.format:checked').attr('value');
    var collection=$('.collection:checked').attr('value');
    var box=$('.box:checked').attr('value');
    var tiraj=$('#tiraj').attr('value');
    var sum;
    var prc;
    var tiraj_col=[];
    var tiraj_id;
    var box_prc;
    var box_choes;
    var items = [];
    var boxs = [];
    var t_box;
    $.getJSON("./json/for_col.php",{}, function(json){
    items=json
    $.getJSON("./json/box.php",{}, function(json1){
    boxs=json1
    $.getJSON("./json/tiraj.php",{}, function(json2){
    tiraj_col=json2;

    pereshet();

    $(":input").change(function(){
    pereshet();
    });





    });
    });
    });


    function pereshet(){
    format_ch();
    collection_ch();
    box_ch();
    all_tiraj();
    f_summ();
    }

    function format_ch(){
    format=$('.format:checked').attr('value');

    }
    function collection_ch(){
    collection=$('.collection:checked').attr('value');

    }
    function box_ch(){
    if(boxs[format+'|'+tiraj_id+'|'+'1']==undefined && boxs[format+'|'+tiraj_id+'|'+'2']==undefined){
    $('.box').attr('disabled', true);
    //alert(format+'|'+tiraj_id+'|'+'1');
    $('#box_text').fadeIn('slow');
    //alert($('.box').attr('disabled'));
    }
    else{
    $('.box').removeAttr('disabled');
    $('#box_text').fadeOut('slow');
    //alert($('.box').attr('disabled'));

    box_choes=$('.box:checked').attr('value');
    if(box_choes!=0){

    b=format+'|'+tiraj_id+'|'+box_choes;
    box_prc=boxs;
    //alert(format+'|'+tiraj_id+'|'+box_choes);
    //alert(box_prc);

    }
    else{
    box_prc=0;

    }
    }
    }



    function all_tiraj(){
    tiraj=$("#tiraj").attr("value");
    if(tiraj<500){
    alert('Тираж не может быть меньше 500');
    $('#tiraj').attr('value', '500');
    }

    for (var i in tiraj_col){


    i=parseInt(i);
    key_p=i+1;
    tiraj=parseInt(tiraj);
    tiraj_col=parseInt(tiraj_col);
    tiraj_col[key_p]=parseInt(tiraj_col[key_p]);


    if(i==24){
    if(tiraj>=tiraj_col)
    {
    tiraj_id=i;

    }
    }
    else
    {

    if(tiraj>=tiraj_col && tiraj<tiraj_col[key_p])
    {
    tiraj_id=i;

    }
    }

    }

    }


    function f_summ(){
    if(tiraj!=undefined && format!=undefined && collection!=undefined){
    c=format+'|'+collection;
    prc=items[c];
    prc=prc*100;
    alert('prc_'+prc);
    tiraj=tiraj.toFixed(0);
    alert('tiraj_'+prc);
    sum=prc*tiraj;

    box_p=box_prc*100;
    if(box_prc!=undefined && box_prc!=0){


    alert('ku!');
    prc=prc + box_p;
    sum=sum + box_p*tiraj;

    }
    alert(sum);
    sum=sum/100;
    prc=prc/100;
    $('#summ').html('Цена:<br> за один '+ prc + '<br>за '+ tiraj + ': ' + sum+'euro');
    }
    }
    });[/js]
    Я совершенно точно уверен что как минимум тираж передаётся ЦЕЛЫМ числом. А возвращается с огромным кол-вом девяток после запятой=( Причём так происходит не всегда. Это что какая-то особенность js?
    [​IMG]
     
  2. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    PHP:
    1.  
    2. <?
    3. $a=0.1;
    4. $b=0.2;
    5. echo (($a+$b) == 0.3 ? 1 : 0);
    6.  
    Какой ответ будет? =)
    В общем, не используйте зря флоат или округляйте.
     
  3. GudGuy

    GudGuy Активный пользователь

    С нами с:
    14 июн 2007
    Сообщения:
    909
    Симпатии:
    0
    Адрес:
    Москва
    я специально на 100 помножаю, там где может быть дробь. Но откуда берутся девятки???? ТЫСЯЧИ ИХ!!!
     
  4. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    tiraj=tiraj.toFixed(0);
    вот это зачем
     
  5. GudGuy

    GudGuy Активный пользователь

    С нами с:
    14 июн 2007
    Сообщения:
    909
    Симпатии:
    0
    Адрес:
    Москва
    Забыл удалить.

    Тестил разные способы округления. Всё было совсем пофиг.
     
  6. GudGuy

    GudGuy Активный пользователь

    С нами с:
    14 июн 2007
    Сообщения:
    909
    Симпатии:
    0
    Адрес:
    Москва
    [js] alert(4.23*100)[/js]
    А сколько у вас получается??
    у меня - 423.00000000000006
    ЭТО КАК ПЛИН???
     
  7. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    Вы скажите чего хотите то? Решить проблему или узнать, почему она возникает?
     
  8. GudGuy

    GudGuy Активный пользователь

    С нами с:
    14 июн 2007
    Сообщения:
    909
    Симпатии:
    0
    Адрес:
    Москва
    Ну, знание причины даёт путь к устранению следствий.
    В любом случаи я пока не увидел(не понял?) ни того, ни другого =(
     
  9. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    Знание проистекает из принципов хранения вещественных чисел. Читать IEEE 754 всякое прочее на эту тему.
    Решение очень простое - работая с вещественными числами всегда определяй точность с которой работаешь и округляй результат. Т.е. используй toFixed для результата вычислений.
     
  10. GudGuy

    GudGuy Активный пользователь

    С нами с:
    14 июн 2007
    Сообщения:
    909
    Симпатии:
    0
    Адрес:
    Москва
    Спасибо. Хотя вообще это бред, конечно. Они это править собираются? Ну, в том смысле, что такое безобразие не увеличивает удобство работы=(
     
  11. MiksIr

    MiksIr Активный пользователь

    С нами с:
    29 ноя 2006
    Сообщения:
    2.339
    Симпатии:
    44
    Кто "они"? Данный вопрос вообще никакого отношения к жаваскипту не имеет.