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) 値 (:id、:note、:data、:price、:repeat、:forecast、:cat_id) 、:info_id、:mutable、:rem_id、:original_id、:is_id)

4

1 に答える 1

0

float をデータベースに正確に格納することはできません。浮動小数点値は常に丸めの問題を引き起こします。10 進数または数値型を使用する必要があります。

値を割り当てるときは、次の方法で行います。

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 に答える