如果我比较一下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的可枚举min使用,那么我得到以下结果:
irb(main):001:0> a <=> b
=> nil
irb(main):002:0> a <=> c
=> nil并且没有出现错误。这是Ruby中的一个问题,还是我误解了min,还有什么东西我可以用来实现与枚举的min一样的不会爆炸的效果呢?
发布于 2016-07-20 20:56:53
来自Ruby语言文档
NaN从未被认为与任何其他值相同,甚至NaN本身也是如此: N=::new(‘NaN’) N == 0.0 -> 0 N == n -> 0
据我所知,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 https://stackoverflow.com/questions/38261689
复制相似问题