Как получить 2 целых числа отдельно до и после точки

Страницы: 1
RSS
Как получить 2 целых числа отдельно до и после точки
 
 например есть число 1.3
надо получить число до точки  и второе число после точки
                       
 
нашел
                       
 
Код
function GetPair(x)
  local s = tostring(x)
  s = s:sub(s:find (".")+2, 15)
  if s == "" then
    s = 0
  end
  return math.floor(x), tonumber(s)
end
 
print(GetPair(5.6))
print(GetPair(5.9999999))
print(GetPair(6))
 
на самом деле math.modf

https://uopilot.uokit.com/wiki/index.php?title=Math.modf_(Lua)
 
Nikolay,
Эта функция не возвращает 2 целых числа, как в вопросе указано.
Хотя, конечно, на её основе сделать тоже можно, хорошая подсказка
 
 например есть число
x=1.3
z,e=math.modf (x)
print(z,e)
------------------
результат:
1          0.3
 
если "0." мешают, просто удалите 2 первых символа из стори
 
из строки
 
Не заметил, что целое. Если известен scale, то умножить на 10 в степени.

Или можно воспользоваться магией динамической

tonumber(tostring(3.12459):match("%.(%d+)")) or 0
 
Цитата
Nikolay написал:
Не заметил, что целое. Если известен scale, то умножить на 10 в степени.

Или можно воспользоваться магией динамической

tonumber(tostring(3.12459):match("%.(%d+)")) or 0
Почему не сделать просто?
a,b=string.match(123.456,"(%d+)%.?(%d*)")


Впрочем, интересно, а в курсе ли уважаемый топикстартер, что 1.2  и 1.02 дадут одинаковый результат?
www.bot4sale.ru

Пасхалочка для Алексея Иванникова: https://forum.quik.ru/messages/forum10/message63088/topic7052/#message63088
 
Цитата
s_mike@rambler.ru написал:
Цитата
Nikolay написал:
Не заметил, что целое. Если известен scale, то умножить на 10 в степени.

Или можно воспользоваться магией динамической

tonumber(tostring(3.12459):match("%.(%d+)")) or 0
Почему не сделать просто?
a,b=string.match(123.456,"(%d+)%.?(%d*)")


Впрочем, интересно, а в курсе ли уважаемый топикстартер, что 1.2  и 1.02 дадут одинаковый результат?
если надо быстрее, то так:
x1,x2,a,b=string.find(x,"(%d+)%.?(%d*)")
==================
сравним:
local x=123.456
nkarray.start()
local a,b=string.match(x,"(%d+)%.?(%d*)")
local u=0.1* nkarray.stop()
print(a,b,u)

nkarray.start()
x1,x2,a,b=string.find(x,"(%d+)%.?(%d*)")
local u=0.1*nkarray.stop()
print(a,b,u)
===================
результат (мкс):
123 456 8.6
123 456 1.8
==================
вариант с find в 4 раза быстрее.
 
если надо целую и дробную часть, то так:
local x=123.456
local a,b=math.modf (x)
local u=0.1*nkarray.stop()
print(a,b,u)
-------------------------
результат (мкс):
123 0.456 0.6
================
в 12 раз быстрее,  чем с match и в 3 раза быстрее чем с find
 
local x=123.456
nkarray.start()
local a,b=math.modf (x)
local u=0.1*nkarray.stop()
print(a,b,u)
 
Цитата
s_mike@rambler.ru написал:
Цитата
Nikolay написал:
Не заметил, что целое. Если известен scale, то умножить на 10 в степени.

Или можно воспользоваться магией динамической

tonumber(tostring(3.12459):match("%.(%d+)")) or 0
Почему не сделать просто?
a,b=string.match(123.456,"(%d+)%.?(%d*)")


Впрочем, интересно, а в курсе ли уважаемый топикстартер, что 1.2  и 1.02 дадут одинаковый результат?
еще один вариант и
в итоге все варианты :
-----------
Код
local x=123.456
local s=tostring(x);
nkarray.start()
local a,b=math.modf (x)
local u=0.1*nkarray.stop()
print(a,b,u)

nkarray.start()
local a,b=string.match(s,"(%d+)%.?(%d*)")
local u=0.1*nkarray.stop()
print(a,b,u)

nkarray.start()
x1,x2,a,b=string.find(s,"(%d+)%.?(%d*)")
--local a=string.sub(x,1,m-1);
--local b=string.sub(x,m+1);
local u=0.1*nkarray.stop()
print(a,b,u)

nkarray.start()
local m=string.find(s,".",1,true)
local a=string.sub(s,1,m-1);
local b=string.sub(s,m+1);
local u=0.1*nkarray.stop()
print(a,b,u)
результат (мкс):
123 0.456 0.6
123 456    7.2
123 456    1.1
123 456    0.8
------------
 
с учетом преобразования числа в строку получим следующее
Код
local x=123.456
nkarray.start()
local a,b=math.modf (x)
local u=0.1*nkarray.stop()
print(a,b,u)

nkarray.start()
local s=tostring(x);
local a,b=string.match(s,"(%d+)%.?(%d*)")
local u=0.1*nkarray.stop()
print(a,b,u)

nkarray.start()
local s=tostring(x);
x1,x2,a,b=string.find(s,"(%d+)%.?(%d*)")
--local a=string.sub(x,1,m-1);
--local b=string.sub(x,m+1);
local u=0.1*nkarray.stop()
print(a,b,u)

nkarray.start()
local s=tostring(x);
local m=string.find(s,".",1,true)
local a=string.sub(s,1,m-1);
local b=string.sub(s,m+1);
local u=0.1*nkarray.stop()
print(a,b,u)
123 0.456   0.6
123 456     8.5
123 456    1.9
123 456    2.1
Страницы: 1
Читают тему
Наверх