OpenSearch(Elasticsearch)长整型字段写入2^53+1被舍入问题咨询
问题原因解析
这个现象的核心原因出在JSON的数值解析机制上,和OpenSearch/Elasticsearch的long字段存储能力本身无关:
- JSON标准里没有单独的整数类型,所有数值都会被当作IEEE 754双精度浮点数处理。而双精度浮点数能精确表示的最大整数是
2^53(也就是9007199254740992),超过这个范围的整数无法被精确编码,会被自动舍入到最近的可表示的浮点数。 - 虽然Java的long类型是64位整数,支持到
2^63-1,但当你通过JSON请求向OpenSearch写入数值时,请求里的数值会先被JSON解析器转换成双精度浮点数。比如你传9007199254740993,这个数超出了双精度的精确范围,解析后就变成了和9007199254740992等价的浮点数,最终存入long字段的自然是这个被舍入后的值。 - 要准确存储超过
2^53的整数,最稳妥的方式是把数值以字符串形式传入,同时确保字段映射为long类型(OpenSearch会自动将合法的整数字符串转换为long存储)。
内容的提问来源于stack exchange,提问作者Руслан Гильмутдинов
相关产品推荐
相关产品推荐

