无效的浮点值 – swift 3 ios

我有核心的数据存储,我的领域“费用安装”在Float识别。 费用金额为6.3。 但是,当我将它检索到variables“expensesAmount”,如下所示,它变成了6.30000019。 所以我的总金额是不正确的。

有人可以帮忙吗?

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

尝试Follwoing:

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

我认为这与如何用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 } 

所以,如果你需要小数部分的真实精度,你需要考虑其他的方法。

编辑:我检查了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 

正如你在(6)处看到的,在(1)中转换6.3时没有四舍五入。 注意63.0可以用w / float / double精确表示。