在红宝石,我想一个浮点数转换为int如果它是一个整数。例如

a = 1.0
b = 2.5

a.to_int_if_whole # => 1
b.to_int_if_whole # => 2.5

基本上我试图避免在任意数量的不具有十进制显示” 0.0" 。我在找一个优雅(或内置)的方式做

def to_int_if_whole(float)
  (float % 1 == 0) ? float.to_i : float
end
有帮助吗?

解决方案 3

这是结束了工作,我希望它的方式解决:

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?逻辑(I好像tadman的是最复杂的)如果需要的话,它可确保在任何地方一个Float输出到一个字符串(例如,在一种形式)它出现我它想要的方式(即,在端部没有零)。

感谢大家对你的想法 - 他们真的有帮助。

其他提示

的一个简单方法将是:

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

一个一个衬里的sprintf ...

sprintf("%g", 5.0)
=> "5"

sprintf("%g", 5.5)
=> "5.5"

我不知道很多关于Ruby。

但是,这是一个显示问题。我将非常惊讶,如果你使用的是库没有办法当你把它转换成字符串格式的数字。

有可能不是一个包罗万象的格式选项,你想要做什么,但你可以设置一个返回true的方法,如果浮子是一个整数和虚假的浮点表示并非如此。里面你创建(所以你只需要做这一次的地方)的格式化程序只需改变基于该格式,如果这是真的还是假的。

讨论如何控制小数时之后出现的位数显示的数字。

当心浮点表示的复杂性。数学可以说,答案是3,但你可能会得到3.000000000000000000001。我建议使用一个增量,以查看是否数量几乎是一个整数。

虽然我会倾向于与上述职位同意,如果你必须这样做:

(float == float.floor) ? float.to_i : float

如果使用的是导轨可以使用辅助number_to_rounded与选项strip_insignificant_zeros,例如:

ActiveSupport::NumberHelper.number_to_rounded(42.0, strip_insignificant_zeros: true)

或这样的:

42.0.to_s(:rounded, strip_insignificant_zeros: true)

这里的教育目的我可怕hacktastic实现:

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的风格呼叫是其处理浮点近似值更加可靠比浮法#轮方法趋于。

我不知道很多关于Ruby无论是。

但是,在C ++中,我会做这样:

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

然后我格式化基于所述输出的精确度。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top