首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Ruby枚举在min函数中不能比较BigDecimal NaN

Ruby枚举在min函数中不能比较BigDecimal NaN
EN

Stack Overflow用户
提问于 2016-07-08 08:00:03
回答 1查看 803关注 0票数 3

如果我比较一下abc

代码语言:javascript
复制
[a,b,c].min

哪里

代码语言:javascript
复制
a = BigDecimal.new("NaN")
b = BigDecimal.new("NaN")
c = BigDecimal.new("0.0")

我得到:

代码语言:javascript
复制
ArgumentError: comparison of BigDecimal with BigDecimal failed

但是,如果我要使用比较运算符,即ruby的可枚举min使用,那么我得到以下结果:

代码语言:javascript
复制
irb(main):001:0>  a <=> b
=> nil

irb(main):002:0>  a <=> c
=> nil

并且没有出现错误。这是Ruby中的一个问题,还是我误解了min,还有什么东西我可以用来实现与枚举的min一样的不会爆炸的效果呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-07-20 20:56:53

来自Ruby语言文档

NaN从未被认为与任何其他值相同,甚至NaN本身也是如此: N=::new(‘NaN’) N == 0.0 -> 0 N == n -> 0

据我所知,NaN值的任何实例都是唯一和不可比拟的。

考虑一下下面的代码片段:

代码语言:javascript
复制
require 'bigdecimal'

a = BigDecimal('NaN')
b = BigDecimal('NaN')

puts a == b
puts a > b
puts a < b

您将得到每个比较的falseminmax依赖于排序来产生结果,正如@phoffer所指出的,sort根据第二个数是否等于、大于或小于第一个数生成值0、1和-1。

TL;DR:任何时候在操作中使用NaN,都不能期望有意义的结果。

如果您正在使用的API返回NaN,您至少可以通过检测它来保护自己不受这种情况的影响。NaN实际上是Float的一个实例,所以您可以使用nan?方法来测试它。

代码语言:javascript
复制
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 
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38261689

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档