dollar
@dollar
123

Как элегантнее всего сделать функцию, которая округляет число, только если он ближе 0.1 к целому, иначе nil?

Вообще нужно для Lua.
Но на JS тоже годится, просто тогда из функций можно использовать только Math.floor(), а вместо nil можно возвращать любое не-число (undefined, null, NaN, false, "false" и т.д.).
round(7) ---> 7
round(7.1) ---> 7
round(7.2) ---> nil
round(7.3) ---> nil
round(-5.2) ----> nil
round(-5.9) ----> -6
round(-5.1) ---> -5
round(-5.05) ----> -5
  • Вопрос задан
  • 102 просмотра
Решения вопроса 2
miraage
@miraage
Lead Software Engineer
100 лет на Lua не кодил, спасибо за ностальгию)

https://repl.it/repls/IndelibleCluelessAdmin

-- http://lua-users.org/wiki/SimpleRound
function round(num, numDecimalPlaces)
  local mult = 10 ^ (numDecimalPlaces or 0)
  return math.floor(num * mult + 0.5) / mult
end

function round_or_nil(num)
  local diff = math.abs(math.fmod(num, 1))
  
  if diff <= 0.1 or diff >= 0.9 then
    return round(num)
  end

  return nil
end


print(round_or_nil(7))
print(round_or_nil(7.3))
print(round_or_nil(-5.2))
print(round_or_nil(-5.9))
print(round_or_nil(-5.1))
print(round_or_nil(-5.05))
Ответ написан
dollar
@dollar Автор вопроса
123
local function round_or_nil(num)
	local res = math.floor(num + 0.5)
	local diff = math.abs(res - num)
	return (diff <= 0.1 or diff >= 0.9) and res or nil
end
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
Deonisius
@Deonisius
Родился в 11110110111 году, 11000 января.
Но на JS тоже годится

https://jsfiddle.net/vgzah83L/
const roundOrNil = (n) => Math.abs(~~n - n) > 0.1 ? null : ~~n;

console.log(roundOrNil(7)); // 7
console.log(roundOrNil(7.3)); // null
console.log(roundOrNil(-5.2)); // null
console.log(roundOrNil(-5.9)); // null
console.log(roundOrNil(-5.1)); // -5
console.log(roundOrNil(-5.05)); // -5
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
Александрия Москва
от 200 000 до 250 000 руб.
Foodtronics Москва
от 100 000 до 200 000 руб.
Алгоритмика Москва
от 120 000 до 200 000 руб.
21 авг. 2019, в 00:43
500 руб./за проект
21 авг. 2019, в 00:14
1000 руб./за проект