【问题标题】:Ruby Time object converted from float doesn't equal to orignial Time object从浮点数转换的 Ruby Time 对象不等于原始 Time 对象
【发布时间】:2013-09-13 11:30:16
【问题描述】:
time = Time.now
fvalue = time.to_f
return time == Time.at(fvalue)

这里有人可以解释为什么上面的表达式返回 false。如何从浮点数创建一个与原始时间变量匹配的新时间对象?

谢谢

【问题讨论】:

    标签: ruby time comparison


    【解决方案1】:

    IEEE 754 double(由to_f 返回)不够准确,无法表示准确时间。

    t1 = Time.now
    f1 = t1.to_f
    t2 = Time.at(f1)
    
    # they look the same
    t1.inspect #=> '2013-09-09 23:46:08 +0200'
    t2.inspect #=> '2013-09-09 23:46:08 +0200'
    
    # but double does not have enough precision to be accurate to the nanosecond
    t1.nsec #=> 827938306
    t2.nsec #=> 827938318
    #                  ^^
    
    # so they are different
    t1 == t2 #=> false
    

    执行以下操作,以保持准确的时间:

    t1 = Time.now
    r1 = t1.to_r # value of time as a rational number
    t2 = Time.at(r1)
    t1 == t2 #=> true
    

    来自Time.to_r的引用:

    此方法旨在用于获得准确的值 表示自纪元以来的纳秒。你可以使用这个方法 将时间转换为另一个纪元。

    【讨论】:

    • 我发现了一些奇怪的东西。似乎 to_r 不能准确地反映 nsec。 Date.today.end_of_day.to_r == (Date.today + 1.day).beginning_of_day.to_r => true ; Date.today.end_of_day.nsec => 999999999; (Date.today + 1.day).beginning_of_day.nsec => 0.
    猜你喜欢
    • 2012-10-26
    • 2017-08-24
    • 1970-01-01
    • 1970-01-01
    • 2017-09-17
    • 1970-01-01
    • 2010-10-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多