Ruby:如何检查负零
Ruby: How to check for negative zero
如何确定 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 的方式?
原因 ruby 将它们确定为同一对象,唯一的方法是在字符串转换后通过“-”符号检测它,如您所述:-0.0.to_s.start_with?('-')
.
angle
方法(它的别名 arg
和 phase
)returns 零表示正浮点数,Pi 表示负数。
p 0.0.angle #=> 0
p -0.0.angle #=> 3.141592653589793
Ruby 的 BigDecimal
class 有一个 sign
方法可以为负零生成正确的结果。如果 require 'bigdecimal/util'
.
,则可以使用 to_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 中 Float
等于 -0.0
和 0.0
returns 为真,根据 ordinary arithmetic.
但是,如果您使用小端或大端字节顺序将两个浮点数转换为字节,您会发现它们实际上并不匹配。
[-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
如果您的目的是防止 "negative zero",那么这就是 rails does it:
number = number.abs if number.zero?
如何确定 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 的方式?
原因 ruby 将它们确定为同一对象,唯一的方法是在字符串转换后通过“-”符号检测它,如您所述:-0.0.to_s.start_with?('-')
.
angle
方法(它的别名 arg
和 phase
)returns 零表示正浮点数,Pi 表示负数。
p 0.0.angle #=> 0
p -0.0.angle #=> 3.141592653589793
Ruby 的 BigDecimal
class 有一个 sign
方法可以为负零生成正确的结果。如果 require 'bigdecimal/util'
.
to_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 中 Float
等于 -0.0
和 0.0
returns 为真,根据 ordinary arithmetic.
但是,如果您使用小端或大端字节顺序将两个浮点数转换为字节,您会发现它们实际上并不匹配。
[-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
如果您的目的是防止 "negative zero",那么这就是 rails does it:
number = number.abs if number.zero?