Ruby круглое плавание to_int, если целое число

Мой был бы этим в c# 3.0:)

var type = typeof(IMyInterface);
var types = AppDomain.CurrentDomain.GetAssemblies()
    .SelectMany(s => s.GetTypes())
    .Where(p => type.IsAssignableFrom(p));

В основном, наименьшее количество объема повторений всегда будет:

loop assemblies  
 loop types  
  see if implemented.
27
задан mskfisher 15 May 2012 в 13:36
поделиться

6 ответов

Это решение, которое в итоге работало так, как я хотел:

class Float
  alias_method(:original_to_s, :to_s) unless method_defined?(:original_to_s)

  def is_whole?
    self % 1 == 0
  end

  def to_s
    self.is_whole? ? self.to_i.to_s : self.original_to_s
  end
end

Таким образом я могу обновить логику is_whole? (мне кажется, что tadman - это наиболее изощренный), если необходимо, и гарантирует, что где бы то ни было, вывод Float в строку (например, в форме) будет выглядеть так, как я хочу (то есть без нулей на конце).

Спасибо всем за вашу идеи - они действительно помогли.

5
ответ дан 28 November 2019 в 04:04
поделиться

Один простой способ:

class Float
  def prettify
    to_i == self ? to_i : self
  end
end

Это потому, что:

irb> 1.0 == 1
=> true
irb> 1 == 1.0
=> true

Тогда вы могли бы сделать:

irb> 1.0.prettify
=> 1

irb> 1.5.prettify
=> 1.5
50
ответ дан 28 November 2019 в 04:04
поделиться

Я мало что знаю о Ruby.

Но это проблема display . Я был бы очень удивлен, если бы в используемых вами библиотеках не было возможности форматировать число при преобразовании его в строку.

Может не быть универсальной опции форматирования, которая делает именно то, что вы хотите, но вы может настроить метод, который возвращает true, если float является представлением целого числа с плавающей запятой, и false в противном случае. Внутри создаваемой вами процедуры форматирования (так что вам нужно сделать это только один раз) просто измените форматирование в зависимости от того, истинно это или нет.

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

Остерегайтесь хитросплетений представлений с плавающей запятой. Математика может сказать, что ответ - 3, но вы можете получить 3000000000000000000001. Я бы предложил использовать дельту, чтобы увидеть, является ли число почти целым.

Математика может сказать, что ответ - 3, но вы можете получить 3000000000000000000001. Я бы предложил использовать дельту, чтобы увидеть, является ли число почти целым.

Математика может сказать, что ответ - 3, но вы можете получить 3000000000000000000001. Я бы предложил использовать дельту, чтобы увидеть, является ли число почти целым.

3
ответ дан 28 November 2019 в 04:04
поделиться

Я тоже мало что знаю о Ruby.

Но в C ++ я бы сделал следующее:

bool IsWholeNumber( float f )
{
    const float delta = 0.0001;
    int i = (int) f;
    return (f - (float)i) < delta;
}

И затем я бы отформатировал точность вывода на основе этого.

0
ответ дан 28 November 2019 в 04:04
поделиться

Вот моя ужасно хактастическая реализация, предоставленная в образовательных целях:

class Float
  def to_int_if_whole(precision = 2)
    ("%.#{precision}f" % self).split(/\./).last == '0' * precision and self.to_i or self
  end
end

puts 1.0.to_int_if_whole # => 1
puts 2.5.to_int_if_whole # => 2.5
puts 1.9999999999999999999923.to_int_if_whole # => 2

Причина использования стиля sprintf Вызов заключается в том, что он обрабатывает приближения с плавающей запятой гораздо надежнее, чем метод Float # round.

1
ответ дан 28 November 2019 в 04:04
поделиться

Хотя я склонен согласиться с указанным выше сообщением, если вам необходимо это сделать:

(float == float.floor) ? float.to_i : float
2
ответ дан 28 November 2019 в 04:04
поделиться
Другие вопросы по тегам:

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