Дробная часть числа
#1

Как взять дробную часть числа?
new Float:fFract = floatfract(3249.34); мне нужен Int
Есть допустим число 352.892,мне нужно взять 892
new number = 892; а не 0.892
Reply
#2

Ну, например так: записываешь флоат в строку, циклом ищешь в строке точку, отрезаешь все до точки (или с точкой), конвертируешь в интегер, выводишь полученный интегер.

А если лень самому думать, вот примерный пример О_о
pawn Code:
stock TakePartOfFloat(Float:f)
{
    new _s[64];
    format(_s, 64, "%f", f);
    new final[32];
    new from;
    for(new i = 0; i <= strlen(_s); i++)
    {
        if(_s[i] == '.') {  from = i+1; break; }
    }
    strmid(final, _s, from, strlen(_s), 64);
    new retval = strval(final);
    return retval;
}

public OnPlayerCommandText(playerid, cmdtext[])
{
    if(strcmp(cmdtext,"/something",true) == 0)
    {
        printf("retval = %d",  TakePartOfFloat(1234.5678));
        return 1; // в моём случае вывело "retval = 567749"
    }
}
Reply
#3

iEnemY, да вы батенька, извращенец


float.inc:

Code:
floatfract(f);
Если инклюдить влом, вот натив:

Code:
native Float:floatfract(Float:value);
Reply
#4

Необходимости использования данной функции не возникало, по сему знать о ней не знал. Просто взял и написал)
Reply
#5

Quote:
Originally Posted by jhonyxakep
View Post
floatfract(f);
разве он не возвращает дробную часть?
пример 4.678 он мне выдаст 0.678,а надо 678
Reply
#6

учите математику:

Циклом умножаем число на 10, и проверяем что возвращает floatfract(f);. Когда вернет 0, значит вы получили дробную часть в целом виде
Reply
#7

А в моём искусно извращённом примере из "123.456" всегда вернёт "456" ^^
Добавить %.4f, и будет с большей точностью возвращать.
Reply
#8

Quote:

А в моём примере из "123.456" всегда вернёт "456" ^^

Да я и не спорю, но все-же разница между двумя способами... Хотя от безысходности можно и строку парсить
Reply
#9

Ну почему же от безысходности, хоть и небольшая нагрузка на мосх, во время написания своего способа (пускай хоть и изобретение колеса) всегда полезна.
Reply
#10

можно в левой части дроби делать 0.
Float:fract = number - floatround(number, floatround_tozero);
после этого число всегда будет иметь вид: 0.<дробная часть>
затем первые 2 символа отрезать и все.
Reply
#11

получаем дробную часть, умножаем на 1000, используем floatval, наслаждаемся.
Reply
#12

А так не сработает?
pawn Код:
new Float:fFract = floatfract(3249.34) << 2;
Reply
#13

Quote:

new Float:fFract = floatfract(3249.34) << 2;

И тут пришел OKStyle со смещениями.

Вся проблема в определении количества знаков после запятой.
Reply


Forum Jump:


Users browsing this thread: 1 Guest(s)