我认为这是关系到浮点数是如何与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。
使用'CGFloat'而不是'Float'。这对我有用。 –