Почему код пришет 0 в дробной части ? Например: 4 192 075 776 bytes -> 3.0 Gb (вместо 3.9) 1 436 155 904 bytes -> 1.0 Gb (вместо 1.4) Есть ли у кого правильное решение вопроса? Код (Text): __int64 i64=(wfd.nFileSizeHigh <<32) + wfd.nFileSizeLow; // GIGABYTE if(i64>1024*1024*1024) { sprintf(buffer,"%u,%2.2lu GB",i64/1024/1024/1024,(i64%(1024*1024*1024)) * 100 / 1024 / 1024 / 1024); }
/ - целочисленное деление когда применяется к целым числам. Надо привести типы к вещественным: Код (Text): ((float) i64)/1024/1024/1024 Соответственно % - то же самое
Код (Text): sprintf(buffer,"%u,%2.2lu GB",((float) i64/1024/1024/1024),((float) i64%(1024*1024*1024)) * 100 / 1024 / 1024 / 1024); test.cpp(742) : error C2296: '%' : illegal, left operand has type 'float'
Код (Text): 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, обшибся