我正在为 UIlabel 分配一个浮点值,当限制超出其处理限制时,该值会更改并显示不正确的结果。我正在使用具有最小字体文本值和截尾的自动调整文本。 我正在制作一个计算器。如果我想要 50000x50000 的结果,结果应该是 2500000000.0000 但标签显示类似 2499999548.0000
最佳答案
如果您阅读了 http://en.wikipedia.org/wiki/Floating_point ...您会发现任何大于 10,000 的数字都需要使用 64 位 float 而不是 32 位 float ,如果您希望保留四位小数。
double
数据类型是 64 位 float 。
要特别小心 CGFloat
,因为它在 iPhone 5S 上是 64 位的,在 iPhone 5C 和任何旧款 iPhone 上是 32 位的。
64 位 float 对于数十亿的数字是准确的。如果大于此值,您将需要开始使用 NSDecimalNumber
类。这可能是您应该为计算器应用程序做的事情。
下面演示了为什么在需要准确性时不应使用 float 或 double:
float aFloat = 10000.2;
float bFloat = 10000.0;
NSLog(@"%.15f", aFloat - bFloat); // 0.200195312500000
double aDouble = 10000.2;
double bDouble = 10000.0;
NSLog(@"%.15f", aDouble - bDouble); // 0.200000000000728
NSDecimalNumber *a = [NSDecimalNumber decimalNumberWithString:@"10000.2"];
NSDecimalNumber *b = [NSDecimalNumber decimalNumberWithString:@"10000.0"];
NSLog(@"%@", [a decimalNumberBySubtracting:b]); // 0.2
对于非常大的数字,情况更糟:
float aFloat = 10000000000000000000000.2;
float bFloat = 10000000000000000000000.0;
NSLog(@"%.15f", aFloat - bFloat); // 0.000000000000000
double aDouble = 10000000000000000000000.2;
double bDouble = 10000000000000000000000.0;
NSLog(@"%.15f", aDouble - bDouble); // 0.000000000000000
NSDecimalNumber *a = [NSDecimalNumber decimalNumberWithString:@"10000000000000000000000.2"];
NSDecimalNumber *b = [NSDecimalNumber decimalNumberWithString:@"10000000000000000000000.0"];
NSLog(@"%@", [a decimalNumberBySubtracting:b]); // 0.2
关于ios - UIlabel 在运行时给出了错误的浮点值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21720196/