Ruby:如何检查负零

时间:2015-01-09 08:52:14

标签: ruby

如何判断Float值是否为零(而不是正数)?

不幸的是:

-0.0 == 0.0   # => true
-0.0 === 0.0  # => true

我的初步解决方案有效,但很难看:

x.to_s == '-0.0' 

this question,我找到了

x == 0 and 1 / x < 0

有更好的,更像Ruby的方式吗?

5 个答案:

答案 0 :(得分:5)

Ruby的BigDecimal类有一个sign方法,可以为负零产生正确的结果。如果Float,您可以使用BigDecimal方法将to_d转换为require 'bigdecimal/util'

require 'bigdecimal'
require 'bigdecimal/util'

0.0.to_d.sign
#=> 1

-0.0.to_d.sign
#=> -1

将此与zero?相结合,您就可以了:

def negative_zero?(x)
  x.zero? && x.to_d.sign == -1
end

negative_zero?(0.0)
#=> false

negative_zero?(-0.0)
#=> true

答案 1 :(得分:3)

angle方法(以及它的别名argphase)为正浮点数返回零,为负数返回Pi。

p 0.0.angle  #=> 0
p -0.0.angle #=> 3.141592653589793

答案 2 :(得分:1)

在Ruby中,Float-0.0的{​​{1}}等于运算符返回true,符合ordinary arithmetic

但是,如果使用little-endian或big-endian字节顺序将两个浮点数转换为字节,则表示它们实际上并不匹配。

0.0

答案 3 :(得分:0)

因为ruby将它们确定为同一个对象,唯一的方法是通过&#34; - &#34;字符串转换后签名,如您所述:-0.0.to_s.start_with?('-')

答案 4 :(得分:0)

如果您的目的是防止“负零”,那么rails does it就是这样:

number = number.abs if number.zero?