为什么某些时间比较会产生违反直觉的结果呢?

eir*_*kir 0 ruby time ruby-2.1

在Ruby 2.1.2,我可以成功地比较的结果Time.parse,并Time.utc在同一时间,它返回预期true:

Time.parse("2015-02-09T22:38:43Z") == Time.utc(2015, 2, 9, 22, 38, 43)
=> true
Run Code Online (Sandbox Code Playgroud)

但是,false当第二个值不是整数时,同样的比较会违反直觉:

Time.parse("2015-02-09T22:38:43.1Z") == Time.utc(2015, 2, 9, 22, 38, 43.1)
=> false
Run Code Online (Sandbox Code Playgroud)

尽管事实上第二个值仍然是整数并且仍然是等价的:

Time.parse("2015-02-09T22:38:43.1Z").sec
=> 43
Time.utc(2015, 2, 9, 22, 38, 43.1).sec
=> 43
Time.parse("2015-02-09T22:38:43.1Z").sec == Time.utc(2015, 2, 9, 22, 38, 43.1).sec
=> true
Run Code Online (Sandbox Code Playgroud)

而且,比较结果true是在相同方法的连续调用之间:

Time.parse("2015-02-09T22:38:43.1Z") == Time.parse("2015-02-09T22:38:43.1Z")
=> true
Time.utc(2015, 2, 9, 22, 38, 43.1) == Time.utc(2015, 2, 9, 22, 38, 43.1)
=> true
Run Code Online (Sandbox Code Playgroud)

为什么会这样?这是一个错误,还是我错过了什么?

Jes*_*per 5

Ruby在比较时间时比较小数秒和秒.出于某种原因,您的时间会收到不同的小数秒:

Time.parse("2015-02-09T22:38:43.1Z").subsec
# => (1/10)
Time.utc(2015, 2, 9, 22, 38, 43.1).subsec
# => (14073748835533/140737488355328)
Run Code Online (Sandbox Code Playgroud)

  • 听起来像通常的浮点shenanigans- 43.1无法准确表示. (2认同)