私は、これは浮動小数点数は、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で正確に表現できます。
'Float'ではなく' CGFloat'を使います。これは私のために働く。 –