检查Float是否等效于Ruby中的整数值

Ski*_*ick 28 ruby type-conversion

说我有以下代码:

x = 0.8
y = 1.0
Run Code Online (Sandbox Code Playgroud)

什么是最好的检查方式y相当于Integer?目前我正在做:

y.to_int == y
Run Code Online (Sandbox Code Playgroud)

哪个有效,但我觉得应该有一个更好的方法.

Dog*_*ert 67

mod的值为1,并检查该值是否等于0.

if y % 1 == 0
Run Code Online (Sandbox Code Playgroud)


Tod*_*obs 5

TL; 博士

通常,==当您不关心数字类型时,应该使用比较数字,这应该是大部分时间。当你真的关心类型时,你应该使用继承自Numeric#eql? .

可能有效的最简单的事情

您可以只询问数字对象是否为整数。例如,数字#整数?让您要求一个数字检查自身并返回一个布尔值:

[1, 1.2, 1.02e+1].map(&:integer?)
#=> [true, false, false]
Run Code Online (Sandbox Code Playgroud)

如果您关心的只是找出y是否是整数,那么这就是要走的路。使用您自己的示例:

y = 1
y.integer?
#=> true

y = 1.0
y.integer?
#=> false
Run Code Online (Sandbox Code Playgroud)

其他解决方案

如果您正在尝试做一些更复杂的事情,例如在等式比较中尝试避免自动数字类型转换,唯一真正的限制是您的想象力和您试图在代码中清楚表达的想法。Numeric、Float、Integer、Object、String 和其他类中有许多方法可以让您执行类型转换和严格相等比较。下面是几个例子。

使用#eql?

使用各种方法转换为整数,然后检查严格的对象相等性:

y = 1.2

# All of these will return false.
y.eql? y.truncate
y.eql? y.floor
y.eql? y.to_i
y.eql? Integer(y)
Run Code Online (Sandbox Code Playgroud)

用#zero 检查余数?

如果您想创建一个没有由 进行的自动数字转换的布尔表达式==,您可以使用从Numeric#zero?继承的特定于类的方法. 例如:

(y % 1).zero?
y.modulo(1).zero?
Run Code Online (Sandbox Code Playgroud)

使用 #ceil 或 #floor 与减法

如果 modulo 不能为您解决某些类型的数字,那么您可以使用Float#ceilFloat#floor

y = 1.2
(y - y.floor).zero?
#=> false

y = 1.02e+1
(y.floor - y).zero?
#=> false
Run Code Online (Sandbox Code Playgroud)

  • 整数?方法不直观,因为 3.0.integer? == 假的。 (6认同)