bigint值超出范围后,java解析后变成负数

比如id值为:16140901070782684196,使用java解析column.getUint64Value()后仍然为负数,这种情况要怎么解决呢?

在 Java 中,long 类型的取值范围是 -2^63 到 2^63-1,如果将一个超出这个范围的数值转换为 long 类型,会导致溢出,从而得到一个错误的结果。在 TiDB 中,bigint 类型的取值范围是 -2^63 到 2^63-1,如果将一个超出这个范围的 bigint 值转换为 long 类型,也会导致溢出,从而得到一个错误的结果。

为了解决这个问题,可以使用 BigInteger 类型来表示 bigint 值。BigInteger 类型可以表示任意大小的整数,不会出现溢出的问题。在 Java 中,可以使用 new BigInteger(String val) 方法将一个字符串转换为 BigInteger 类型,然后使用 toString() 方法将 BigInteger 类型转换为字符串,或者使用 longValue() 方法将 BigInteger 类型转换为 long 类型。

例如,对于 bigint 值为 16140901070782684196,可以使用以下代码将其转换为 BigInteger 类型:

String str = "16140901070782684196";
BigInteger bigInt = new BigInteger(str);

然后,可以使用 toString() 方法将 BigInteger 类型转换为字符串:

String str2 = bigInt.toString();

或者使用 longValue() 方法将 BigInteger 类型转换为 long 类型:

long value = bigInt.longValue();

需要注意的是,如果 bigint 值超出了 long 类型的取值范围,使用 longValue() 方法将会抛出一个 ArithmeticException 异常。此时,可以考虑使用 BigInteger 类型来进行计算,或者使用其他方式来处理这个值。