sqlite3_column:text16() rounds floating point values with more than 15 decimal digits after the decimal point to 15 decimal digits after the decimal point.
Here is the relevant code from "sqlite3VdbeMemStringify" which is called by "sqlite3_column_text16":
assert( fg & MEM_Real );
sqlite3_snprintf(nByte, pMem->z, "%!.15g", pMem->r);
The precision of 15 is insufficient and should be 17 instead (see http://speleotrove.com/decimal/decifaq6.html#binapprox), otherwise what you store in the database is not exactly as what you get from the database (rounded to 15 decimal digits after the decimal point) and what you would get by sqlite3_column_double().