我怎樣才能找出一個Float
值是負零(而不是一個積極的)?紅寶石:如何檢查零負
不幸的是:
-0.0 == 0.0 # => true
-0.0 === 0.0 # => true
我最初的解決方案的工作,但醜:
x.to_s == '-0.0'
從this question,我發現
x == 0 and 1/x < 0
是否還有更好的,更多的紅寶石般的方式?
我怎樣才能找出一個Float
值是負零(而不是一個積極的)?紅寶石:如何檢查零負
不幸的是:
-0.0 == 0.0 # => true
-0.0 === 0.0 # => true
我最初的解決方案的工作,但醜:
x.to_s == '-0.0'
從this question,我發現
x == 0 and 1/x < 0
是否還有更好的,更多的紅寶石般的方式?
angle
方法(以及它的別名arg
和phase
)對於正浮點數返回零,對於負數返回Pi。
p 0.0.angle #=> 0
p -0.0.angle #=> 3.141592653589793
原因紅寶石確定它們爲同一物體通過檢測到它的唯一途徑「 - 」號串轉換後,像你描述:-0.0.to_s.start_with?('-')
。
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
這麼多新東西..我仍然需要學習.. :)感謝您的顯示。 –
在Ruby中的Float
等號操作-0.0
和0.0
返回true,按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
感謝教學老學校數學:-) –