表格存储服务 CloudTable-为什么OpenTSDB写入大整数时,有时候会精度丢失?

时间:2023-11-01 16:15:51

为什么OpenTSDB写入大整数时,有时候会精度丢失?

假设在OpenTSDB中写入了如下数据:

表1 数据示例

Metrics

Timestamp

tag

value

Money

1483200000

Card1

9223372036854775709

1483200001

Card1

9223372036854775709

1483200002

Card1

922337203685477.12

1483200003

Card1

9223372036854775700

当查询时,返回的结果如下:

{"1483200000":9223372036854775709,"1483200001":9.223372036854776E18, "1483200002":9.223372036854771E14,"1483200003":9223372036854775700}

Timestamp为1483200001的value值变成了9.223372036854776E18,与原值9223372036854775709相比数据精度有变化。

这是因为OpenTSDB在返回数据的时候,如果后一个数据(即"1483200002":9.223372036854771E14)是一个浮点数,那么会把当前数据也转换为浮点数进行返回。

同时,整型值9223372036854775709,如果要以浮点型(Double)的数据形式表示的话,就只能表示为9.223372036854776E18了这是因为Double在内存中是以科学计数法的方式表示的:

1bit(符号位)11bits(指数位)52bits(尾数位)

而精度是由尾数位决定的,所以Double的精度为2^52 = 4503599627370496,一共16位, double的精度最大就为16位。这样就不能完整的表示9223372036854775709(19位)这个整数了。

建议,同一个Metric数据,不要混合插入整型和浮点型的数据,这样就不会发生类似的问题。

support.huaweicloud.com/cloudtable_faq/cloudtable_faq_0011.html