2015-01-09 79 views
2

我怎樣才能找出一個Float值是負零(而不是一個積極的)?紅寶石:如何檢查零負

不幸的是:

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

我最初的解決方案的工作,但醜:

x.to_s == '-0.0' 

this question,我發現

x == 0 and 1/x < 0 

是否還有更好的,更多的紅寶石般的方式?

回答

3

angle方法(以及它的別名argphase)對於正浮點數返回零,對於負數返回Pi。

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

感謝教學老學校數學:-) –

0

原因紅寶石確定它們爲同一物體通過檢測到它的唯一途徑「 - 」號串轉換後,像你描述:-0.0.to_s.start_with?('-')

5

Ruby的BigDecimal類有一個sign方法,該方法產生用於負零正確的結果。你可以轉換一個FloatBigDecimalto_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 
+0

這麼多新東西..我仍然需要學習.. :)感謝您的顯示。 –

1

在Ruby中的Float等號操作-0.00.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