2016-11-17 8 views
1

私はコアデータストレージを持っていましたが、Floatの私のフィールド "expensesAmount"が識別しています。 expensesAmountの値は6.3です。 しかし、これを変数 "expensesAmount"に次のように取得すると、6.30000019になります。 したがって、totalAmountが正しくありません。無効なフロート値 - swift 3 ios

誰かが助けることができますか?

let entity:NSManagedObject = data?.object(at: i) as! NSManagedObject      
if let expensesAmount = entity.value(forKey: "expensesAmount") as? Float {       
    totalAmount += expensesAmount     
} 
+0

'Float'ではなく' CGFloat'を使います。これは私のために働く。 –

答えて

0

Follwoing試してみてください。

let entity:NSManagedObject = data?.object(at: i) as! NSManagedObject 

if let expensesAmount = entity.value(forKey: "expensesAmount") as? NSNumber { 

totalAmount += expensesAmount.floatValue 

} 
0

私は、これは浮動小数点数は、IEEE-754規格に表現されているかに関係していると思います。標準では、すべての種類の数が必ずしも倍精度でも正確に表現されるわけではありません。これはSwiftとは関係ありません。 Cの次の小さなコードが問題を再現します。

int main(int argc, char **argv) { 
    float fval = 6.3f; 
    double dval = 6.3; 
    printf("%.10f : %.17f\n", fval, dval); 
    // 6.3000001907 : 6.29999999999999980 
} 

したがって、小数部分で実際の精度が必要な場合は、他の方法を検討する必要があります。

EDITED: NSDecimalNumberでチェックしたところ、期待どおりに動作しています。次に例を示します。

let bval = NSDecimalNumber(string: "6.3") // (1) 6.3 
    let bval10 = bval.multiplying(by: 10.0) // 63.0 
    let dval = bval.doubleValue 
    let dval10 = bval10.doubleValue 
    print(String(format: "%.17f", dval)) // 6.29999999999999982 
    print(String(format: "%.17f", dval10)) // (6) 63.00000000000000000 
    let bval2 = NSDecimalNumber(mantissa: 63, exponent: -1, isNegative: false) 
    print(bval2) // 6.3 
    let bval3 = NSDecimalNumber(mantissa: 123456789, exponent: -4, isNegative: true) 
    print(bval3) // -12345.6789 

(1)で6.3を変換するときに、(6)、オフなしラウンドありませんで、あなたが見ることができるように。注63.0はfloat/doubleで正確に表現できます。

+0

この問題に関するご提案はありますか?私はダブルに変換しなければならなかったので、結果は6.29999999999999980のように見えます。 Charts 3.0を使用しているので、Doubleの値を変換する必要があります。 – user831098

+0

ダブルで問題が解決するとは限りません。分数部分に本当の精度が必要な場合は、整数演算を行う必要があります。そうするためには、すべての喘息が整数であるように、小数点の桁数(0.XXX <= 3)を知り、1/XXXを掛ける必要があります。または、BCD関節炎がiOSで利用可能かどうかを確認する必要があります。 – beshio

+0

Appleの文書をチェックしましたが、NSDecimalNumberは基数10の算術演算(BCD)を処理できるようです。私は今私とMacを持っていないと私は確認できませんが、ドキュメントから、それは動作するようです。 https://developer.apple.com/reference/foundation/nsdecimalnumberを確認してください – beshio

関連する問題