В AMXX используется собственная имплементация printf.
Тут написано что в обычном printf используется округление к ближайшему четному.
Проверяем:
Код:
#include <amxmodx>
public plugin_init()
{
register_plugin("test", "0.0", "Lev");
register_srvcmd("test", "cmd_test");
}
public cmd_test(id)
{
new range = 21;
new Float:f;
server_print("------------");
f = 13.37;
server_print("--> %f %.2f", f, f);
f = 13.36;
server_print("--> %f %.2f", f, f);
server_print("------------");
f = 13.30;
for (new i = 0; i < range; i++)
{
server_print("--> %f %.2f", f, f);
f += 0.001;
}
server_print("------------");
f = -13.30;
for (new i = 0; i < range; i++)
{
server_print("--> %f %.2f", f, f);
f -= 0.001;
}
}
Цитата:
------------
--> 13.369999 13.36
--> 13.359999 13.35
------------
--> 13.300000 13.30
--> 13.301000 13.30
--> 13.302000 13.30
--> 13.303001 13.30
--> 13.304001 13.30
--> 13.305002 13.30
--> 13.306002 13.30
--> 13.307003 13.30
--> 13.308003 13.30
--> 13.309003 13.30
--> 13.310004 13.31
--> 13.311004 13.31
--> 13.312005 13.31
--> 13.313005 13.31
--> 13.314005 13.31
--> 13.315006 13.31
--> 13.316006 13.31
--> 13.317007 13.31
--> 13.318007 13.31
--> 13.319007 13.31
--> 13.320008 13.32
------------
--> -13.300000 -13.30
--> -13.301000 -13.30
--> -13.302000 -13.30
--> -13.303001 -13.30
--> -13.304001 -13.30
--> -13.305002 -13.30
--> -13.306002 -13.30
--> -13.307003 -13.30
--> -13.308003 -13.30
--> -13.309003 -13.30
--> -13.310004 -13.31
--> -13.311004 -13.31
--> -13.312005 -13.31
--> -13.313005 -13.31
--> -13.314005 -13.31
--> -13.315006 -13.31
--> -13.316006 -13.31
--> -13.317007 -13.31
--> -13.318007 -13.31
--> -13.319007 -13.31
--> -13.320008 -13.32
Со всей очевидностью, применяется округление отбрасыванием (windows/linux, amxx 1.8.1).
Поэтому используем самое простое решение:
Код:
#include <amxmodx>
public plugin_init()
{
register_plugin("test", "0.0", "Lev");
register_srvcmd("test", "cmd_test");
}
public cmd_test(id)
{
new range = 21;
new Float:f;
server_print("------------");
f = 13.37;
server_print("--> %f %.2f", f, f >= 0 ? f + 0.005 : f - 0.005);
f = 13.36;
server_print("--> %f %.2f", f, f >= 0 ? f + 0.005 : f - 0.005);
server_print("------------");
f = 13.30;
for (new i = 0; i < range; i++)
{
server_print("--> %f %.2f", f, f >= 0 ? f + 0.005 : f - 0.005);
f += 0.001;
}
server_print("------------");
f = -13.30;
for (new i = 0; i < range; i++)
{
server_print("--> %f %.2f", f, f >= 0 ? f + 0.005 : f - 0.005);
f -= 0.001;
}
}
Цитата:
------------
--> 13.369999 13.37
--> 13.359999 13.36
------------
--> 13.300000 13.30
--> 13.301000 13.30
--> 13.302000 13.30
--> 13.303001 13.30
--> 13.304001 13.30
--> 13.305002 13.31
--> 13.306002 13.31
--> 13.307003 13.31
--> 13.308003 13.31
--> 13.309003 13.31
--> 13.310004 13.31
--> 13.311004 13.31
--> 13.312005 13.31
--> 13.313005 13.31
--> 13.314005 13.31
--> 13.315006 13.32
--> 13.316006 13.32
--> 13.317007 13.32
--> 13.318007 13.32
--> 13.319007 13.32
--> 13.320008 13.32
------------
--> -13.300000 -13.30
--> -13.301000 -13.30
--> -13.302000 -13.30
--> -13.303001 -13.30
--> -13.304001 -13.30
--> -13.305002 -13.31
--> -13.306002 -13.31
--> -13.307003 -13.31
--> -13.308003 -13.31
--> -13.309003 -13.31
--> -13.310004 -13.31
--> -13.311004 -13.31
--> -13.312005 -13.31
--> -13.313005 -13.31
--> -13.314005 -13.31
--> -13.315006 -13.32
--> -13.316006 -13.32
--> -13.317007 -13.32
--> -13.318007 -13.32
--> -13.319007 -13.32
--> -13.320008 -13.32
Можно пойти чуточку дальше и сэкономить на нативах:
Код:
server_print("--> %f %.2f", f, _:f >= 0 ? f + 0.005 : f - 0.005);
Было:
Код:
0x1EC LOAD.S.pri -0x4
0x1F4 MOVE.alt
0x1F8 ZERO.pri
0x1FC PUSH.pri
0x200 PUSH.pri
0x204 PUSH.alt
0x208 PUSH.C 0x8
0x210 CALL operator>=(Float:,_:)
0x218 POP.alt
0x21C JZER jump_0000
Стало:
Код:
0x2E4 LOAD.S.pri -0x4
0x2EC MOVE.alt
0x2F0 ZERO.pri
0x2F4 XCHG
0x2F8 JSLESS jump_0002
Добавлено спустя 2 часа 51 минуту 17 секунд:UPD: поправил насчет printf.