程序中用到一个大整数。存储在 MySQL 数据库那边用了 bigint 类型,程序运算过程中就有了点麻烦。integer用不了,只能用 __int64 这个数据类型。
麻烦一,从数据表取数据。以前在数据表取回整形数据时用的都是Query->FieldByName("data")->AsInteger这样的写法。现在数据超过integer的最大限度时,这个写法取回的数据是错误的。需要改成Query->FieldByName("data")->Value。
麻烦二,界面编辑输入数据。从界面编辑框取回的都是AnsiString类型数据,它的数据转换method有ToInt(),ToDouble()等。ToInt()显然不行,超宽之后转换结果全是错的。ToDouble()从字面理解,应该是转成double类型。根据资料,double类型的精度能达到十进制十五六位的样子,不能完整覆盖__int64的数据范围。于是写了几句程序,用来把AnsiString串转成__int64。
思路很简单,就是把字串从低位开始截成9位宽的片段,在integer的范围之内,使用ToInt()方法把每段转成整数,再乘以对应位的倍数。19位以上乘10的18次方,18到10位乘10的9次方,再把各段数据相加。写法要注意,直接数据的末尾要加上“i64”的修饰符。
但后来通过实际测试发现不用这么麻烦。看下面这几句。
__int64 a;
double b;
AnsiString str="12345678901234567890";
a=str.ToDouble();
b=str.ToDouble();
程序执行之后,变量a按64Bit精度保存了str的内容,变量b则按double的精度保存了数据。
于是,麻烦不再是麻烦,需要从AnsiString转换大整数时,直接ToDouble()就OK。
麻烦没了,却有了疑惑。这个ToDouble()是怎么工作的呢?根据联机文档的说明,ToDouble()返回值应该是double,为什么它可以返回整数呢?不得而知。
C++Builder 中使用 __int64 整数的问题