Где Кругло () в C++? [дубликат]

@ kimmo-letho answer - отлично (вторая часть, где условие фактически изменено.

Я бы добавил более идиоматическую версию, просто ради полноты, и потому что добавить ее нелегко) код в комментариях.

array.each do |item|
  x, _ = item
  case
  when x.nil?
    item[1] = false
  when x.respond_to?("string")
    item[1] = 'it is a string'
  end
end

С другой стороны, у меня сложилось впечатление, что вы создаете массив [x, true] вручную перед циклом. Если все, что вам нужно, это напечатать (или вернуть) предметы, которые имеют истинное состояние, вы можете сделать лучше:

# xs => [x1, x2, x3, ...]
# where your original array was [[x1, cond1], [x2, cond2], ...]
xs.reject do |x|
  x.nil? || x.respond_to?("string") || x+y[x] == 4
end

Если у вас уже было какое-то ложное состояние, и вы хотите сохранить предыдущее:

# array => [[x1, cond1], [x2, cond2], ...]
array.map do |x, cond|
  [x, cond && !(x.nil? || x.respond_to?("string") || x+y[x] == 4)]
end
38
задан Community 23 May 2017 в 12:33
поделиться

4 ответа

Можно использовать 11 C++ std::round() .

, Если Вы все еще застреваете с более старыми стандартами, можно использовать std::floor() , который всегда округляется к более низкому количеству, и std::ceil() , который всегда округляется к более высокому количеству.

Для получения нормального поведения округления Вы действительно использовали бы floor(i + 0.5).

Этот путь даст Вам проблемы с отрицательными числами, обходное решение для той проблемы при помощи, перекрывают () для отрицательных чисел:

double round(double number)
{
    return number < 0.0 ? ceil(number - 0.5) : floor(number + 0.5);
}

Другой, инструмент для очистки, но более ресурсоемкий, путь состоит в том, чтобы использовать stringstream и input-/output-manipulators:

#include <iostream>
#include <sstream>

double round(double val, int precision)
{
    std::stringstream s;
    s << std::setprecision(precision) << std::setiosflags(std::ios_base::fixed) << val;
    s >> val;
    return val;
}

Только используют второй подход, если Вы не являетесь низкими на ресурсах и/или должны управлять точностью.

63
ответ дан Patrick Glandien 27 November 2019 в 03:26
поделиться

Используя floor(num + 0.5) не будет работать на отрицательные числа. В этом случае необходимо использовать ceil(num - 0.5).

double roundToNearest(double num) {
    return (num > 0.0) ? floor(num + 0.5) : ceil(num - 0.5);
}
15
ответ дан Bill the Lizard 27 November 2019 в 03:26
поделиться

На самом деле нет круглой функции в Microsoft math.h.
Однако Вы могли использовать Математику статического метода:: Вокруг () вместо этого.
(В зависимости от Вашего типа проекта.)

3
ответ дан Sani Singh Huttunen 27 November 2019 в 03:26
поделиться

Я не знаю, является ли это лучшая практика или не, но использование 0,5 техник с полом (), кажется, способ пойти.

0
ответ дан Elroy 27 November 2019 в 03:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: