0

我在我的应用程序中使用FMDatabase,当我尝试插入这些值 -0.02、-0.01、-0.03 时出现小错误。

我试图插入一个简单的带有精确值的简单查询,但当我尝试使用 FMDatabase 插入上面的值时,我得到了 -0.019999999、0.009999999。谁能建议我如何解决这个问题?

在下面的代码中我得到了-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');

准备好的声明:

INSERT INTO UTransaction (id, note, data, price, repeat, forecast, cat_id, info_id, mutable, rem_id, original_id, is_id) VALUES (:id, :note, :data, :price, :repeat, :forecast, :cat_id , :info_id, :mutable, :rem_id, :original_id, :is_id)

4

1 回答 1

0

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

在分配值时,请通过以下方式进行:

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]);
}
于 2013-06-24T09:40:04.787 回答