преобразование в строку вида "1.1 Гб"

Тема в разделе "WASM.WIN32", создана пользователем 10_Brasil, 4 окт 2006.

  1. 10_Brasil

    10_Brasil New Member

    Публикаций:
    0
    Регистрация:
    20 апр 2006
    Сообщения:
    54
    Почему код пришет 0 в дробной части ?
    Например:
    4 192 075 776 bytes -> 3.0 Gb (вместо 3.9)
    1 436 155 904 bytes -> 1.0 Gb (вместо 1.4)

    Есть ли у кого правильное решение вопроса?

    Код (Text):
    1. __int64 i64=(wfd.nFileSizeHigh <<32) + wfd.nFileSizeLow;
    2.  
    3. // GIGABYTE
    4. if(i64>1024*1024*1024)
    5. {
    6.     sprintf(buffer,"%u,%2.2lu GB",i64/1024/1024/1024,(i64%(1024*1024*1024)) * 100 / 1024 / 1024 / 1024);
    7. }
     
  2. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    / - целочисленное деление когда применяется к целым числам. Надо привести типы к вещественным:
    Код (Text):
    1. ((float) i64)/1024/1024/1024
    Соответственно % - то же самое
     
  3. 10_Brasil

    10_Brasil New Member

    Публикаций:
    0
    Регистрация:
    20 апр 2006
    Сообщения:
    54
    Код (Text):
    1. sprintf(buffer,"%u,%2.2lu GB",((float) i64/1024/1024/1024),((float) i64%(1024*1024*1024)) * 100 / 1024 / 1024 / 1024);
    2.  
    3. test.cpp(742) : error C2296: '%' : illegal, left operand has type 'float'
     
  4. gilg

    gilg New Member

    Публикаций:
    0
    Регистрация:
    19 май 2005
    Сообщения:
    527
    Код (Text):
    1. sprintf(buffer,"%u,%2.2lu GB", (int) ((float) i64/1024/1024/1024, i64%(1024*1024*1024)) * 100 / 1024 / 1024 / 1024);
    i64 - 8 байт длиной. Параметр %u говорит printf() забрать из стека 4 байта. Следующие четыре байта забираются %2.2lu. Соответственно оба параметра для печати заполняются первым переданным значением, второй просто не выводился.
    Про % - sorry, обшибся
     
  5. Avoidik

    Avoidik New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2004
    Сообщения:
    288
    Адрес:
    Russia
    вот тут готовая реализация

    http://slil.ru/23210615
     
  6. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    10_Brasil
    Код (Text):
    1. sprintf(buffer, "%2.2g Gb", (float) i64 / (1024 * 1024 *1024));