恐怕我已经知道答案了,但是在Ruby 3.2中有没有一种方法可以定义一个大于1的范围?以来
(..1.0).include?(1.0) => true (...1.0).include?(1.0) => false
我希望(1.0...)能创建我需要的东西,但是,
(1.0...)
(1.0..).include?(1.0) => true (1.0...).include?(1.0) => true
uqzxnwby1#
你的答案是正确的,尽管有一些变通方法。来自www.example.com的文档https://docs.ruby-lang.org/en/3.2/Range.html#class-Range-label-Beginless+Ranges一个无边界的范围有一个明确的结束值,但一个空的开始值。这样的范围包括直到端值的所有值。无限范围的文字可以用两个点或三个点来写。该范围具有相同的元素,无论哪种方式。但请注意,两者并不相等。关键是只有结尾被记录为可以排除。一种解决方法是
!(..1.0).include?(other_number)
!的意思是“不”,所以这里的意思是“不在负无穷大到1”。
!
!(..1.0).include?(1.01) # => true !(..1.0).include?(1.00) # => false !(..1.0).include?(0.99) # => false
从技术上讲,这不是一个所有数字都大于1的范围,但它具有相同的效果。你可以继承range来获得自定义行为。
class ExclusionaryRange < Range def include?(other) !(self.end..self.begin).include?(other) end end my_range = ExclusionaryRange.new(1.0, nil) my_range.include?(1.0) # => false my_range.include?(1.1) # => true my_range.include?(0.9) # => false
vybvopom2#
如果你使用浮点数,你可以利用浮点数数量有限的事实(Ruby内部使用64位二进制浮点数,也就是“double“)。你可以通过next_float得到浮点的后继:
next_float
1.0.next_float #=> 1.0000000000000002
为方便起见,1.0000000000000002的输出是四舍五入的表示。这个数字的精确值是1.00000000000002220446049250313080847263336181640625。没有其他的(64位二进制)浮点数比1.0更接近1.0。如果你从这个浮点数开始你的范围,它将有效地跳过1.0:
1.0000000000000002
1.0
(1.0.next_float..).include?(1.0) #=> false (1.0.next_float..).include?(1.0001) #=> true
请注意,典型的浮点奇数仍然适用:
(0.3.next_float..).include?(0.3) #=> false (0.3.next_float..).include?(0.1 + 0.2) #=> true
2条答案
按热度按时间uqzxnwby1#
你的答案是正确的,尽管有一些变通方法。来自www.example.com的文档https://docs.ruby-lang.org/en/3.2/Range.html#class-Range-label-Beginless+Ranges
一个无边界的范围有一个明确的结束值,但一个空的开始值。这样的范围包括直到端值的所有值。无限范围的文字可以用两个点或三个点来写。该范围具有相同的元素,无论哪种方式。但请注意,两者并不相等。
关键是只有结尾被记录为可以排除。
一种解决方法是
!
的意思是“不”,所以这里的意思是“不在负无穷大到1”。从技术上讲,这不是一个所有数字都大于1的范围,但它具有相同的效果。
你可以继承range来获得自定义行为。
vybvopom2#
如果你使用浮点数,你可以利用浮点数数量有限的事实(Ruby内部使用64位二进制浮点数,也就是“double“)。你可以通过
next_float
得到浮点的后继:为方便起见,
1.0000000000000002
的输出是四舍五入的表示。这个数字的精确值是1.00000000000002220446049250313080847263336181640625。没有其他的(64位二进制)浮点数比1.0更接近1.0。如果你从这个浮点数开始你的范围,它将有效地跳过
1.0
:请注意,典型的浮点奇数仍然适用: