2016-11-17 72 views
1

我有核心数据存储,我的字段“expenseAmount”在浮点标识中。 expensesAmount的值为6.3。 但是,当我将它检索到变量“expensesAmount”,如下所示,它变成了6.30000019。 所以我的总金额是不正确的。无效浮点值 - swift 3 ios

有人可以帮忙吗?

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

使用'CGFloat'而不是'Float'。这对我有用。 –

回答

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 
} 

因此,如果您需要小数部分的真实精度,则需要考虑其他方法。

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

+0

对这个问题的任何建议?我不得不转换成双倍,所以结果看起来像6.29999999999999980。由于我使用图表3.0,需要转换Double – user831098

+0

中的值Double可能并不总能解决您的问题。如果您需要小数部分的真实精度,则需要进行整数运算。为此,您需要知道小数位数(0.XXX <= 3),并乘以1/XXX,以便所有哮喘均为整数。或者你需要检查BCD关节炎是否适用于iOS。 – beshio

+0

我检查了Apple的文档,似乎NSDecimalNumber可以处理基数10算术(BCD)。我现在没有Mac和我在一起,我无法检查,但从文档看来,它似乎工作。检查https://developer.apple.com/reference/foundation/nsdecimalnumber – beshio