ruby-on-rails - Ruby Enumerable 无法在 min 函数中比较 BigDecimal NaN

标签 ruby-on-rails ruby comparison

如果我像这样比较abc

[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

对于这些比较中的每一个,您都会得到 falseminmax 依赖排序来产生结果,正如@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/

相关文章:

mysql - 在 ActiveRecord 中按多个 id 获取分组值

ruby - ruby 可以实现多重继承吗?

linux - diff 文件只比较每行的前 n 个字符

ruby-on-rails - Sinatra 对像 Controller 这样的 Web 服务的好处

sharepoint - Windows SharePoint Services 与 Microsoft Office SharePoint Server?

swift - 在 Swift 3 中,比较两个闭包的方法是什么?

mysql - RoR : Cannot change_column in postgres, 在 MySQL 中正常(MySQL 用于开发,Postgres on Heroku)

ruby-on-rails - 在 Rails 生成器中检索生成器名称

ruby-on-rails - 环境日志文件的默认 Rails 路径

ruby-on-rails - 为什么此测试失败 - 未实现错误 Rspec 3.1.x 和 Rails 4.1.9