Ruby:如何检查负零

Ruby:如何检查负零,ruby,Ruby,如何确定Float值是否为负零(而不是正零) 不幸的是: -0.0 == 0.0 # => true -0.0 === 0.0 # => true 我最初的解决方案可行,但很难看: x.to_s == '-0.0' 从,我发现 x==0和1/x

如何确定
Float
值是否为负零(而不是正零)

不幸的是:

-0.0 == 0.0   # => true
-0.0 === 0.0  # => true
我最初的解决方案可行,但很难看:

x.to_s == '-0.0' 
从,我发现

x==0和1/x<0

有更好、更像红宝石的方法吗

原因ruby将它们确定为同一个对象,这是在字符串转换后通过“-”号检测它的唯一方法,如您所述:
-0.0.以“-”开头
角度
方法(其别名
arg
相位
)为正浮点返回零,为负浮点返回Pi

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

Ruby的
BigDecimal
类有一个
sign
方法,该方法为负零生成正确的结果。如果
需要“BigDecimal/util”
,则可以使用
to\u d
方法将
Float
转换为
BigDecimal

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

在Ruby中,
-0.0
0.0
Float
相等运算符根据返回true

但是,如果您使用小尾端或大尾端字节顺序将两个浮点转换为字节,您将看到它们实际上不匹配

[-0.0].pack('E')
#=> "\x00\x00\x00\x00\x00\x00\x00\x80"

[0.0].pack('E')
#=> "\x00\x00\x00\x00\x00\x00\x00\x00"

[-0.0].pack('E') == [0.0].pack('E')
#=> false

如果您的目的是防止“负零”,那么以下方法是:


这么多新事物。。我还需要学习……)谢谢你展示这个。
[-0.0].pack('E')
#=> "\x00\x00\x00\x00\x00\x00\x00\x80"

[0.0].pack('E')
#=> "\x00\x00\x00\x00\x00\x00\x00\x00"

[-0.0].pack('E') == [0.0].pack('E')
#=> false
number = number.abs if number.zero?