UIlabel在运行时给出不正确的浮点值

时间:2014-02-12 06:21:07

标签: ios iphone objective-c

我正在为一个UIlabel分配一个浮点值,当限制超过其处理限制时,该值会改变并显示错误的结果。我使用的是具有最小字体文本值的autoresize文本并截断尾部。 我正在制作一个计算器。如果我想要一个50000x50000的结果,结果应该是2500000000.0000,但标签显示的东西像2499999548.0000

6 个答案:

答案 0 :(得分:2)

如果您读取http://en.wikipedia.org/wiki/Floating_point ...您将发现任何大于10,000的数字需要使用64位浮点数而不是32位浮点数(如果您想要有四个小数位)。

double数据类型是64位浮点数。

要特别小心CGFloat因为iPhone 5S上的64位和iPhone 5C以及任何旧款iPhone上的32位。

对于数十亿的数字,64位浮点数是准确的。任何大于此的东西,你都会想要开始使用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

答案 1 :(得分:0)

如果您想显示您的计算,请使用(此处您需要投射浮动。)

float mycalculation = (float)50000*50000;
yourLableName.text = [NSString stringWithFormat:@"%f", mycalculation ];

我使用上面的代码,它适合我。

答案 2 :(得分:0)

试试这个,它的工作.....

问我是否有任何疑问......

NSString *a = @"50000";
NSString *b = @"50000";
float ValueA = [a floatValue]; //instead of "a" you can pass Textfield1.text
float ValueB = [b floatValue]; //instead of "b" you can pass Textfield2.text

NSLog(@"%@",[self getStringFromFloat:ValueA*ValueB]);

-(NSString *)getStringFromFloat:(float)yourFloatValue
{
    return [NSString stringWithFormat:@"Value =%.4f",yourFloatValue];
}

答案 3 :(得分:0)

float num;
num = 50000.0f * 50000.0f;
Lbl.text = [NSString stringWithFormat:@"%f",num];

它完美地为我工作......

答案 4 :(得分:0)

类型也定义你的结果,最好在这种情况下使用double而不仅仅是float

代码上的这两行将起作用..

 double num = (double)50000*50000;
 label.text = [NSString stringWithFormat:@"%.1f",num];

答案 5 :(得分:0)

在值的末尾添加“f”应该可以解决问题。与5.0不同,5.0f为您提供浮点数的字面值。

尝试50000.0f x 50000.0f