ios - UIlabel 在运行时给出了错误的浮点值

标签 ios iphone objective-c

我正在为 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 类。这可能是您应该为计算器应用程序做的事情。

https://developer.apple.com/library/ios/documentation/cocoa/reference/foundation/classes/nsdecimalnumber_class/reference/reference.html

下面演示了为什么在需要准确性时不应使用 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/

相关文章:

objective-c - 使用 NFD unicode 的 NSString 规范化

c++ - Unsigned Long Long 超出范围?

objective-c - typedef 类 : "cannot find interface declaration for ' typedefname'"上的 ObjC 类别

iphone - 执行多线程的正确方法

ios - 我是否应该为我的应用程序的每种本地化语言添加新的应用程序内购买产品?

android - 将 C 库连接到 iOS 应用程序

ios - 以编程方式创建一个对象数组 swift 3

iphone - UITabBarController 中的 UINavigationController 奇怪的弹出动画

特定时间的 iPhone 本地通知

objective-c - 在具有 NSDictionary 定义的程序中迷路 @