Добавление чисел в Lua - избегание отрицательных значений

Это не хардкорная математика, но я просто не могу найти правильную функцию, чтобы сделать это гладко.

Допустим, у меня есть 3 значения. Стоимость1 Стоимость2 Стоимость3. У каждого есть значение, я хочу сложить их вместе в окончательное число, TotalCost.

Cost1+Cost2+Cost3 = TotalCost

Problem is, if any of Cost1/2/3 is negative, I want to make that a ZERO, ie;

Cost1 = -100
Cost2 = 50
Cost3 = 150

Cost1+Cost2+Cost3 = TotalCost 
equals
0 + 50 + 150 = 200

Я знаю, что видел что-то вроде (X*Math.Floor * 100) / 100 , чтобы сделать именно это, если я не совсем ошибаюсь.

Был бы очень признателен, если бы кто-нибудь мог ответить. Я знаю, что это основной вопрос, но я просто не мог понять, как (с умным способом) с математикой. функции.

Я кодирую на Lua: http://lua-users.org/wiki/MathLibraryTutorial


person Olle    schedule 30.03.2016    source источник


Ответы (4)


Возможно, самый короткий способ сделать это — math.max(x,0). Таким образом, ваше выражение будет:

math.max(Cost1,0) + math.max(Cost2,0) + math.max(Cost3,0)

Конечно, вы также можете сделать из него функцию — и вам, вероятно, следует это сделать, если вы собираетесь использовать его не только для одной строки.

person comingstorm    schedule 30.03.2016

Самый простой способ — использовать операторы if, чтобы проверить, является ли число отрицательным.

Это еще один способ:

function my_sum(...)
  sum = 0
  for k, v in ipairs{...} do
    sum = sum + (v > 0 and v or 0)
  end
  return sum
end

print(my_sum(-50, 50, 100))  -- 150

Выражение v > 0 and v or 0 имеет значение v, если v > 0 истинно, и 0 в противном случае.

person Yu Hao    schedule 30.03.2016

Просто напишите именно то, что вы сказали, на Lua вместо английского:

(Cost1 > 0 and Cost1 or 0) + (Cost2 > 0 and Cost2 or 0) + (Cost3 > 0 and Cost3 or 0)
person Oleg V. Volkov    schedule 30.03.2016
comment
Кроме того, пожалуйста, не ищите функции или другие фрагменты, чтобы собрать их воедино. Программирование — это не головоломка. Постарайтесь хотя бы по-человечески понять, что именно вы пишете. Например, я не могу понять ни малейшей связи с тем, как en.wikipedia.org/wiki/Floor_and_ceiling_functions может быть связано с зажатием отрицательных значений. - person Oleg V. Volkov; 30.03.2016

Вы можете просто сделать что-то вроде этого:

local value1 = 100
local value2 = -200
local value3 = 200

local value4 = (value1 > 0 and value1 or 0) + (value2 > 0 and value2 or 0) + (value3 > 0 and value3 or 0)

Лучшим способом было бы реализовать функцию, которая суммирует неотрицательные значения.

function sumOfPositives(tableOfValues)

  local sum = 0

  for i,v in ipairs(tableOfValues) do
    sum = sum + v > 0 and v or 0
  end
  return sum

end

Таким образом, вы можете сделать это для любого количества значений.

Если вы предпочитаете просто вводить значения, не помещая их в таблицу, вы можете сделать то, что предложил Ю Хао, и использовать аргумент ....

person Piglet    schedule 30.03.2016