influxdata / influxdata/influxdb-java

Rounding error when reading long from db and then writing it back.

Open
#440 10 comments 0 reactions 1 assignee View on GitHub

@fmachado is already working on this.

Since Apr 2, 2019.

difficulty/high kind/bug
Dominant language
Java
Stars
1.2k
Forks
469
PR merge metrics
No merged PRs in 30d

Description

Hi,

I am observing rounding errors on integer fields when reading from database and writing them back.

I have a measurement with an integer column that represents a timestamps with nanosecond resolution (note, this is not the default time column).

SHOW FIELD KEYS ON db
name: latency_1
fieldKey   fieldType
--------   ---------
latency_ms integer
msg_name   string
msg_type   integer
path_id    integer
seq_no     integer
ts_egr     integer  <- timestamp_ns
ts_ingr    integer

I am reading the data from database using influxdb-java. All integer values that I am reading are Doubles now (this I believe related to this issue).

String qstatement = String.format(
            "SELECT * FROM %s WHERE time > now() - %dms ORDER BY time ",
            table_name, how_far_back_in_time_ms);
Query query = new Query(qstatement, db_name);
influxDB.query(query, TimeUnit.NANOSECONDS);

For completeness, before writing values back to db, I am adding one more column where I take original value of the "ts_egr" column and convert it to Long before writing it back, i.e.,:

Double ts_egr = (Double)obj; //original "ts_egr" value of the column
Long long_ts = new Long(ts_egr.longValue());

Now I am reading a row from the original table and the new table in InfluxDB:

> select * from latency_1 where seq_no = 70
name: latency_1
time                latency_ms msg_name             msg_type path_id seq_no ts_egr              ts_ingr
----                ---------- --------             -------- ------- ------ ------              -------
1523264395509000000 72         abcdefgh12345678abcd 1        1       70     1523264395509072018 1523264395509000000
> select * from modified_latency_1 where seq_no = 70
name: modified_latency_1
time                latency_ms msg_name             msg_type path_id seq_no ts_egr              ts_egr_long         ts_ingr
----                ---------- --------             -------- ------- ------ ------              -----------         -------
1523264395508999936 72         abcdefgh12345678abcd 1        1       70     1523264395509072100 1523264395509072128 1523264395509000000

Note, the original value of "ts_ingr" 1523264395509072018 has been changed to 1523264395509072100 (just by reading and writing it back) and if we do conversion back to Long in Java we get another variant 1523264395509072128. Overall, I was observing rounding errors up to 100 nanoseconds.

Am I doing something wrong here, and is there a way to avoid the rounding errors?

Thank you

Contributor guide

No contributing guide indexed for this repository

First steps

  1. Read the whole issue, then the project's contributing guide.
  2. Comment on the issue to say you are picking it up — it saves two people doing the same work.
  3. Fork the repository and make your change on a branch.
  4. Open a pull request that references the issue number.

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.