Как обрезать число типа float до 2х знаков после запятой

Страницы: 1
RSS
Как обрезать число типа float до 2х знаков после запятой
 
Добрый день

Подскажите как обрезать число типа float до 2х знаков после запятой
SetSell пишет в таблицу число вот такое 1,1124432871741  и тп...
надо обрезать до 2х знаков после запятой
в библиотеке math ничего не нашел
 
умножить на 100, округлить до целого, и разделить обратно :)
 
Логично )
 
string.sub(Название переменной,1,3) 1 - с первого символа и до 3 т.к. 2 знака после запятой..
 
лучше так:
x=1.1124432871741
y=string.sub(x,1,string.find(x,'.')+3)
print(y)
-------
1.11
 
или так
z=0.01*math.floor(100*x)
print(z)
----------------
1.11
 

Код
function round(num, idp)
  local mult = 10^(idp or 0)
  return math.floor(num * mult + 0.5) / mult
end
или вариант:
Код
function round2(num, idp)
  return tonumber(string.format("%." .. (idp or 0) .. "f", num))
end
пример:
Код
> function test(a, b) print(round(a,b), round2(a,b)) end
> test(43245325.9995, 3)
43245326        43245325.999
> test(43245325.9994, 3)
43245325.999    43245325.999
> test(43245325.5543654)
43245326        43245326
> test(43245325.5543654, 3)
43245325.554    43245325.554
> test(43245325.5543654, 4)
43245325.5544   43245325.5544
источник:
lua-users.org
 
все значительно проще
Код
 f3:write("\tПрибыль в %: "..vr7);
Прибыль в %: 16.504854368932
Код
 f3:write("\tПрибыль в %: "..string.format("%.2f",vr7));
Прибыль в %: 16.50
человек (не робот)
 
Цитата
Владимир Ишанин написал:
string.sub(Название переменной,1,3) 1 - с первого символа и до 3 т.к. 2 знака после запятой..
Владимир, спасибо! Как раз то, что искал.))
 
Цитата
Алексей А. написал:
Цитата
Владимир Ишанин написал:
string.sub(Название переменной,1,3) 1 - с первого символа и до 3 т.к. 2 знака после запятой..
Владимир, спасибо! Как раз то, что искал.))
прикольно, а если будет не 1, а 10 или 100, то сколько знаков будете отделять таким способом?
 
10 или 100 чего будет?
 
Цитата
Алексей А. написал:
10 или 100 чего будет?
Если Вы будете обрезать строку,
string.sub(Название переменной,1,3)
то Вам надо определять сколько позиций в целой части т е сначала найти позицию десятичной точки,
потом вычислить с какой по какую позицию выделить подстроку.
т е эта формула работает лишь тогда когда у вас число меньше 2, а если 10 или 100 то она не работает, надо изменять последнюю цифру.
----------------------
Поэтому универсально работает это:
y=string.sub(x,1,string.find(x,'.')+3)  -- следующая строка после сообщения Владимира.
 
и еще
округлять число через строку - это медленное  решение.
быстрым решением является округление через функцию
пример для сравнения быстродействия:
Код
x=1.112443287174
startA();  z=0.01*math.floor(100*x)            print("t(мкс)="..0.1*stopA()..",z="..z)
startA();  y=string.sub(x,1,string.find(x,'.')+3) print("t(мкс)="..0.1*stopA()..",y="..y)
результат:
Код
D:/lua53/lua53.exe -e "io.stdout:setvbuf 'no'" "nkAI.lua" 
t(мкс)=1.0,z=1.11
t(мкс)=6.2,y=1.11
>Exit code: 0
 
Цитата
nikolz написал:
если 10 или 100 то она не работает, надо изменять последнюю цифру.
Правильно, последнюю цифру меняю в зависимости от количества символов.
string.sub(Название переменной,1,3) - оставляет 3 символа, начиная с 1-го слева, включая запятую (точку).
string.sub(Название переменной,1,5) - оставляет 5 символов, начиная с 1-го слева, включая запятую (точку).

Спасибо за y=string.sub(x,1,string.find(x,'.')+3).
 
Цитата
nikolz написал:
через строку - это медленное  решение
Согласен.

Поэтому позже нашел такое решение: NewStopPrice = PriceC * 1.01 - PriceC * 1.01%0.01.
Вот отсюда: https://bot4sale.ru/blog-menu/qlua/512-floor-to-step.html
 
Цитата
Согласен.

Поэтому позже нашел такое решение: NewStopPrice = PriceC * 1.01 - PriceC * 1.01%0.01.
Вот отсюда:  https://bot4sale.ru/blog-menu/qlua/512-floor-to-step.html
Стоит помнить о вычислениях с плавающей запятой. Такой подход может дать неожиданный сюрприз.
 
Цитата
Nikolay написал:
Стоит помнить о вычислениях с плавающей запятой.
Спасибо за уточнение!
 
Цитата
Алексей А. написал:
Цитата
nikolz написал:
через строку - это медленное  решение
Согласен.

Поэтому позже нашел такое решение: NewStopPrice = PriceC * 1.01 - PriceC * 1.01%0.01.
Вот отсюда:  https://bot4sale.ru/blog-menu/qlua/512-floor-to-step.html
Согласен.
Можно из числа вычесть остаток от деления нацело.
Относительно побочных эффектов сказать ничего не могу.
 
В документации Lua5.1  указано, что a % b == a - math.floor(a/b)*b
---------------------
отсюда  получаем   math.floor(a/b)*b=a - a%b
------------------------
очевидно Михаил, с сайта которого Вы списали формулу ,
просто взял эту формулу из документации на луа и выдал за собственное открытие.
 
Люди, всё гораздо проще !!!
----------------------
x = 1.234567
a= 123.45678

math.floor(x*10)/10)
math.floor(a*100)/100)
------------------------------
Output:
1.2
123.45
 
Цитата
_____ИЛЬЯ_____ написал:
Люди, всё гораздо проще !!!
----------------------
x = 1.234567
a= 123.45678

math.floor(x*10)/10
math.floor(a*100)/100
------------------------------
Output:
1.2
123.45

Я допустил ошибку при копировании
 
А в луа есть тип float?  :).  
Код
function round(num,idp) --функция округления
   if idp and num and type(num)=="number" and type(idp)=="number" then
      local mult=10^(idp or 0)
      local x=0
         if num>=0 then
         x=math.floor(num * mult + 0.5) / mult
         else 
         x=math.ceil(num * mult - 0.5) / mult
      end
      if x==math.floor(x) then x=math.floor(x) end -- обрезка нуля
      return x
   else
      return num
   end
end
 
Еще один вариант.
Код
function round(num, idp)
    
    -- Если num некорректное, вернуть как есть
    if not num or type(num) ~= "number" then return num end
   
    -- Если idp не указан, использовать 0 (округление до целого числа)
    idp = idp or 0 
    local mult = 10^idp

    -- Округление для любого числа
    local rounded = math.floor(num * mult + 0.5) / mult

    -- Если число целое, убрать .0
    if rounded == math.floor(rounded) then
        return math.floor(rounded)
    end

    return rounded
end
 
Цитата
VPM написал:
Еще один вариант.
Код
   function   round (num, idp)
    
     -- Если num некорректное, вернуть как есть 
     if   not  num  or  type(num) ~ =   "number"   then   return  num  end 
   
     -- Если idp не указан, использовать 0 (округление до целого числа) 
    idp  =  idp  or   0  
     local  mult  =   10 ^idp

     -- Округление для любого числа 
     local  rounded  =   math.floor (num  *  mult  +   0.5 ) / mult

     -- Если число целое, убрать .0 
     if  rounded  =  =   math.floor (rounded)  then 
         return   math.floor (rounded)
     end 

     return  rounded
 end 
  
local  rounded  =   math.floor (num  *  mult  +   0.5 ) / mult для отрицательных чисел не корректно
 
Проверил. Нет необходимости отдельно обрабатывать отрицательные числа через math.ceil.
Код
print(round(12.345, 2))  -- 12.35
print(round(-12.345, 2)) -- -12.34
print(round(10.0))       -- 10
print(round(10))         -- 10
print(round(nil))        -- nil
print(round("abc"))      -- "abc"
 
Да заметил не точность вот так будет работать
Код
-- Округление для любого числа
    local rounded = math.floor(num * mult + 0.5 *(num >= 0 and 1 or -1)) / mult
 
print(round(12.345, 2))  -- 12.35
print(round(-12.345, 2)) -- -12.35
 
За чем? Просто округление по единому правилу для положительных отрицательных чисел.
 
Цитата
VPM написал:
Да заметил не точность вот так будет работать  
Код
   -- Округление для любого числа 
     local  rounded  =   math.floor (num  *  mult  +   0.5   * (num  >  =   0   and   1   or   -  1 )) / mult  
round(-12.34, 2)) == -12.35
 
Код
(math.modf(num + (num >= 0 and 0.5 or -0.5)))
 
Да действительно, есть особенности в самой функции  math.floor, углубляться не стал, вернулся к варианту изложенному Kolossi, с двумя правилами, сделал просто более читаемым для себя.
Спасибо за обсуждение.
Казалось бы простая задача округления числа, а вариантов собралось с десяток.
Страницы: 1
Читают тему
Наверх