表格存储服务 CloudTable-为什么OpenTSDB写入大整数时,有时候会精度丢失?
为什么OpenTSDB写入大整数时,有时候会精度丢失?
假设在OpenTSDB中写入了如下数据:
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数据,不要混合插入整型和浮点型的数据,这样就不会发生类似的问题。
- GaussDB获取时间_gaussdb for MySQL_高斯数据库获取时间_华为云
- GaussDB开发_GaussDB数据库开发_高斯数据库开发_华为云
- 免费时序数据库_时序数据库influxdb场景_数据库资源免费领取_实时数据库
- 华为云ModelArts_ModelArts开发_AI全流程开发
- GaussDB扩容_云数据库GaussDB扩容_GaussDB如何扩容-华为云
- gaussdb咋样_gaussdb介绍_gaussdb的优势_gaussdb用法_gaussdb架构
- 央国企15大行业场景化解决方案_政企深度用云_华为云Stack
- GaussDB性能怎么调_华为gaussdb_gaussdb性能_gaussdb学习
- GaussDB升级_云数据库GaussDB升级_GaussDB如何升级-华为云
- GaussDB性能_Gaussdb数据库性能_高斯数据库性能-华为云