文档首页 > > 常见问题> 数据读写类> 为什么OpenTSDB写入大整数时,有时候会精度丢失?

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

分享
更新时间:2020/05/26 GMT+08:00

假设在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数据,不要混合插入整型和浮点型的数据,这样就不会发生类似的问题。

分享:

文档是否有解决您的问题?

提交成功!非常感谢您的反馈,我们会继续努力做到更好!
反馈提交失败,请稍后再试!

*必选

请至少选择或填写一项反馈信息

字符长度不能超过200

提交反馈 取消

如您有其它疑问,您也可以通过华为云社区问答频道来与我们联系探讨

智能客服提问云社区提问