如果我像这样比较a
、b
和c
[a,b,c].min
在哪里
a = BigDecimal.new("NaN")
b = BigDecimal.new("NaN")
c = BigDecimal.new("0.0")
我得到:
ArgumentError: comparison of BigDecimal with BigDecimal failed
但是如果我要使用 ruby 的 Enumerable min uses 的比较运算符然后我明白了:
irb(main):001:0> a <=> b
=> nil
irb(main):002:0> a <=> c
=> nil
并且没有呈现任何错误。这是 Ruby 中的问题还是我误解了 min
,是否有其他东西可以用来实现与 enumerable 的 min
相同的效果,而且不会爆炸?
最佳答案
来自 Ruby 语言 documentation :
NaN is never considered to be the same as any other value, even NaN itself:
n = ::new(‘NaN’)
n == 0.0 -> nil
n == n -> nil
据我了解,NaN
值的任何实例都是唯一且无法比较的。
考虑这个代码片段:
require 'bigdecimal'
a = BigDecimal('NaN')
b = BigDecimal('NaN')
puts a == b
puts a > b
puts a < b
对于这些比较中的每一个,您都会得到 false
。 min
和 max
依赖排序来产生结果,正如@phoffer 指出的那样,sort
根据排序产生 0、1 和 -1 的值第二个数字是否等于、大于或小于第一个数字。
TL;DR:任何时候在操作中使用 NaN 时,您都无法期望得到有意义的结果。
如果您使用的 API 返回 NaN,您至少可以通过检测来保护自己免受这种极端情况的影响。 NaN 实际上是 Float
的实例,因此您可以使用 nan?
方法对其进行测试。
2.2.0 :002 > require 'bigdecimal'
=> true
2.2.0 :003 > a = BigDecimal('NaN')
=> #<BigDecimal:7fae1b3bd050,'NaN',9(9)>
2.2.0 :004 > a.nan?
=> true
关于ruby-on-rails - Ruby Enumerable 无法在 min 函数中比较 BigDecimal NaN,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38261689/