Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/118.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
浮点错误sqlite ios_Ios_Sqlite_Fmdb - Fatal编程技术网

浮点错误sqlite ios

浮点错误sqlite ios,ios,sqlite,fmdb,Ios,Sqlite,Fmdb,我正在应用程序中使用,当我尝试插入这些值-0.02,-0.01,-0.03时,出现了一个小错误 我试着插入一个简单的普通查询,它的精确值是有效的,但是当我试着用FMDatabase插入上面的值时,我得到了-0.01999999,0.00999999。 有谁能建议我如何解决这个问题吗 在下面的代码中,我得到了-0.02,所以我不知道问题出在哪里: if (strcmp([obj objCType], @encode(BOOL)) == 0) { sqlite3_bind_int(pStmt

我正在应用程序中使用,当我尝试插入这些值-0.02,-0.01,-0.03时,出现了一个小错误


我试着插入一个简单的普通查询,它的精确值是有效的,但是当我试着用FMDatabase插入上面的值时,我得到了-0.01999999,0.00999999。 有谁能建议我如何解决这个问题吗

在下面的代码中,我得到了-0.02,所以我不知道问题出在哪里:

if (strcmp([obj objCType], @encode(BOOL)) == 0) {
    sqlite3_bind_int(pStmt, idx, ([obj boolValue] ? 1 : 0));
}
else if (strcmp([obj objCType], @encode(int)) == 0) {
    sqlite3_bind_int64(pStmt, idx, [obj longValue]);
}
else if (strcmp([obj objCType], @encode(long)) == 0) {
    sqlite3_bind_int64(pStmt, idx, [obj longValue]);
}
else if (strcmp([obj objCType], @encode(long long)) == 0) {
    sqlite3_bind_int64(pStmt, idx, [obj longLongValue]);
}
else if (strcmp([obj objCType], @encode(unsigned long long)) == 0) {
    sqlite3_bind_int64(pStmt, idx, (long long)[obj unsignedLongLongValue]);
}
else if (strcmp([obj objCType], @encode(float)) == 0) {
    float fl = [obj floatValue]; // the values is -0.02
    sqlite3_bind_double(pStmt, idx, [obj floatValue]);
}
else if (strcmp([obj objCType], @encode(double)) == 0) {
    sqlite3_bind_double(pStmt, idx, [obj doubleValue]);
}
我的简单示例查询正在运行:

INSERT INTO Transactions VALUES('aaaaaa','aaaaaa',0,-0.02,1,1,'0','0',1,'0','0','aa');
准备好的声明:


在UTransaction(id,note,data,price,repeat,forecast,cat_id,info_id,mutable,rem_id,original_id,is_id)中插入值(:id,:note,:data,:price,:repeat,:forecast,:cat_id,:info_id,:mutable,:rem_id,:original_id,:is_id)

您无法将浮点准确存储到数据库中。浮点值总是会产生舍入问题。您应该使用十进制或数字类型

指定值时,请按以下方式执行:

else if (strcmp([obj objCType], @encode(float)) == 0) {
    float fl = floorf(([obj floatValue]*100)/100); // the values is -0.02
    sqlite3_bind_double(pStmt, idx, [obj floatValue]);
}

您能编写有问题的查询吗?您的第一个错误是交替使用浮点和双精度。显示获取值的FMDB代码。您正在向普通查询中插入双精度。FMDB代码非常庞大,我不认为我可以复制它,我使用的是FMDB数据库。我的第一个错误在哪里?我同意@borrden。但是,如果将浮点/双精度格式设置为小数点后2位,这一问题可能不会出现,ie舍入将有助于您。“但是,当我尝试使用FMDatabase插入上述值时,我得到了-0.019999999,0.00999999”-如何得到?在任何情况下,我建议始终使用double来保持精度。谢谢您的回答,但我的简单查询在使用-0.02的地方起作用。事实上,我刚刚意识到精度损失来自库中某个地方的NSNumber到double。我认为sqlite使用double并将包含浮点值的NSNumber转换为double会导致精度损失。