Руби вычитает одну микросекунду при преобразовании в строку - PullRequest
0 голосов
/ 24 февраля 2019

У меня есть строковая временная метка:

ts = '1550989255.000300'

Как я могу разобрать ts в Time или Datetime объекте как t, и правильно t.strftime('%6N') печатать?

Я сделал:

t = Time.at(ts.to_f)
t.strftime '%6N' #=> "000299"

Руби отсекает одну микросекунду при преобразовании метки времени в строку.

Ответы [ 3 ]

0 голосов
/ 24 февраля 2019

Это работает:

ts = "1550989255.000300"
arr = ts.split('.')
t = Time.at(arr[0].to_i, arr[1].to_i)
t.strftime '%6N'
0 голосов
/ 25 февраля 2019

Рациональные числа более точны, чем Floats, и они все чаще используются в Ruby.

ts = '1550989255.000300'
t  = Time.at(ts.to_r)  # to_r: a rational
p t.strftime '%6N'     # => "000300"
0 голосов
/ 24 февраля 2019

Вы наблюдаете неточность математики с плавающей запятой.Если вам нужна более высокая точность, вы должны использовать BigDecimal.

require 'bigdecimal'

ts = BigDecimal('1550989255.000300')
t  = Time.at(ts)
t.strftime '%6N'

=> "000300"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...