Как обрезать число типа float до 2х знаков после запятой
Пользователь
Сообщений: Регистрация: 20.07.2015
13.11.2015 13:06:25
Добрый день
Подскажите как обрезать число типа float до 2х знаков после запятой SetSell пишет в таблицу число вот такое 1,1124432871741 и тп... надо обрезать до 2х знаков после запятой в библиотеке math ничего не нашел
Пользователь
Сообщений: Регистрация: 02.07.2015
13.11.2015 13:19:54
умножить на 100, округлить до целого, и разделить обратно :)
Пользователь
Сообщений: Регистрация: 20.07.2015
13.11.2015 13:43:33
Логично )
Пользователь
Сообщений: Регистрация: 07.11.2015
13.11.2015 20:54:29
string.sub(Название переменной,1,3) 1 - с первого символа и до 3 т.к. 2 знака после запятой..
Пользователь
Сообщений: Регистрация: 30.01.2015
14.11.2015 08:53:59
лучше так: x=1.1124432871741 y=string.sub(x,1,string.find(x,'.')+3) print(y) ------- 1.11
Пользователь
Сообщений: Регистрация: 30.01.2015
14.11.2015 08:58:08
или так z=0.01*math.floor(100*x) print(z) ---------------- 1.11
Пользователь
Сообщений: Регистрация: 15.11.2015
15.11.2015 05:29:21
Код
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
Если Вы будете обрезать строку, string.sub(Название переменной,1,3) то Вам надо определять сколько позиций в целой части т е сначала найти позицию десятичной точки, потом вычислить с какой по какую позицию выделить подстроку. т е эта формула работает лишь тогда когда у вас число меньше 2, а если 10 или 100 то она не работает, надо изменять последнюю цифру. ---------------------- Поэтому универсально работает это: y=string.sub(x,1,string.find(x,'.')+3) -- следующая строка после сообщения Владимира.
Пользователь
Сообщений: Регистрация: 30.01.2015
21.05.2023 07:32:46
и еще округлять число через строку - это медленное решение. быстрым решением является округление через функцию пример для сравнения быстродействия:
nikolz написал: если 10 или 100 то она не работает, надо изменять последнюю цифру.
Правильно, последнюю цифру меняю в зависимости от количества символов. string.sub(Название переменной,1,3) - оставляет 3 символа, начиная с 1-го слева, включая запятую (точку). string.sub(Название переменной,1,5) - оставляет 5 символов, начиная с 1-го слева, включая запятую (точку).
Спасибо за y=string.sub(x,1,string.find(x,'.')+3).
Пользователь
Сообщений: Регистрация: 20.04.2023
21.05.2023 07:47:33
Цитата
nikolz написал: через строку - это медленное решение
Согласен.
Поэтому позже нашел такое решение: NewStopPrice = PriceC * 1.01 - PriceC * 1.01%0.01. Вот отсюда:
Пользователь
Сообщений: Регистрация: 27.01.2017
21.05.2023 10:12:05
Цитата
Согласен.
Поэтому позже нашел такое решение: NewStopPrice = PriceC * 1.01 - PriceC * 1.01%0.01. Вот отсюда:
Стоит помнить о вычислениях с плавающей запятой. Такой подход может дать неожиданный сюрприз.
Пользователь
Сообщений: Регистрация: 20.04.2023
21.05.2023 10:13:11
Цитата
Nikolay написал: Стоит помнить о вычислениях с плавающей запятой.
Поэтому позже нашел такое решение: NewStopPrice = PriceC * 1.01 - PriceC * 1.01%0.01. Вот отсюда:
Согласен. Можно из числа вычесть остаток от деления нацело. Относительно побочных эффектов сказать ничего не могу.
Пользователь
Сообщений: Регистрация: 30.01.2015
21.05.2023 13:12:16
В документации Lua5.1 указано, что a % b == a - math.floor(a/b)*b --------------------- отсюда получаем math.floor(a/b)*b=a - a%b ------------------------ очевидно Михаил, с сайта которого Вы списали формулу , просто взял эту формулу из документации на луа и выдал за собственное открытие.
Пользователь
Сообщений: Регистрация: 01.11.2024
01.11.2024 14:41:56
Люди, всё гораздо проще !!! ---------------------- x = 1.234567 a= 123.45678
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
Пользователь
Сообщений: Регистрация: 15.06.2023
22.11.2024 18:14:45
Еще один вариант.
Код
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
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 для отрицательных чисел не корректно
Пользователь
Сообщений: Регистрация: 15.06.2023
23.11.2024 09:00:13
Проверил. Нет необходимости отдельно обрабатывать отрицательные числа через math.ceil.
За чем? Просто округление по единому правилу для положительных отрицательных чисел.
Пользователь
Сообщений: Регистрация: 20.03.2023
25.11.2024 08:42:53
Цитата
VPM написал: Да заметил не точность вот так будет работать
Код
-- Округление для любого числа
local rounded = math.floor (num * mult + 0.5 * (num > = 0 and 1 or - 1 )) / mult
round(-12.34, 2)) == -12.35
Пользователь
Сообщений: Регистрация: 20.03.2023
25.11.2024 08:44:45
Код
(math.modf(num + (num >= 0 and 0.5 or -0.5)))
Пользователь
Сообщений: Регистрация: 15.06.2023
05.12.2024 12:45:29
Да действительно, есть особенности в самой функции math.floor, углубляться не стал, вернулся к варианту изложенному Kolossi, с двумя правилами, сделал просто более читаемым для себя. Спасибо за обсуждение. Казалось бы простая задача округления числа, а вариантов собралось с десяток.