2014-02-12 41 views
3

我分配一個浮點值,以一個UILabel當超出限制的限制處理,值的變化,以及我不正確result.I我使用了最小字體文本值自動調整大小的文本和不正確的浮點值截尾。 我想提出一個calculator.If我想爲50000x50000造成的結果應該是2500000000.0000但標籤顯示類似2499999548.0000的UILabel提供了運行時

+0

添加您的標籤的計算結果文本代碼。 –

+0

如果你使用'double'而不是'float'呢?當處理大量數據時,浮點數不準確(請參閱維基百科)。你可以發佈你的代碼分配值的標籤? –

+0

嘗試((浮動)50000 * 50000) – larva

回答

2

如果你有http://en.wikipedia.org/wiki/Floating_point讀......你會發現,比任何數量較大如果你想有四位小數,10000需要使用64位浮點數而不是32位浮點數。

double的數據類型是一個64位浮點數。

要特別小心,因爲CGFloat,這將是在iPhone 5S 64位和在iPhone 5C 32位和任何舊款iPhone。

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 
+0

它給了我正確的結果,直到5000000x1000000 = 5000000000000,但如果我再乘以10這個結果然後答案是出來是49,999,999,139,840.00 – Yieshu

+0

@Yieshu浮點值永遠不是「正確的」 ,浮點數不可能存儲精確的值。隨着數字越來越大,他們的精確度就越低。即使5 * 5會給你一個不正確的浮動,如果你檢查值10或20小數位。如果數值非常大,那麼數據格式變得完全無用,準確性變得非常糟糕。 –

+0

@Yieshu看到我更新的答案,以證明浮動不準確。你應該閱讀我鏈接的維基百科頁面,瞭解它爲什麼這樣做。請注意,double並不能完美地解決問題,它只是意味着您需要更大的值來運行相同的問題。 –

0

如果要顯示那麼你的計算中使用(在這裏你需要轉換浮動)。

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

我使用上面的代碼,它爲我工作正常。

+0

它的罰款,直到這裏,但如果我們再乘以tetsingD與1000那麼結果將如499999999584.0000.How要得到它準確爲500000000000.00 – Yieshu

+0

@YyShu - 那麼你需要改變浮動雙倍這樣喜歡.. double mycalculation =(double) 50000 * 50000 * 1000; – iPatel

+0

我做到了這一點,但對答案沒有任何影響。我正在做double result =((double)result1 *(double)[string floatvalue]); – Yieshu

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]; 
} 
+0

我這樣做,即使那樣我沒有得到所需的結果 – Yieshu

+0

告訴我你的實際情況,你有兩個字符串或浮點值乘法? –

+0

把上面的代碼,因爲它是然後看看會發生什麼.... –

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

它爲我工作完美...

0

類型定義你的結果,以及最好在這種情況下,使用雙不僅僅是浮

這兩條線路上的代碼將工作..

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

將「f」添加到值的末尾應該有訣竅。與5.0不同,5.0f給你一個浮點數的字面值。

嘗試50000.0f x 50000.0f

相關問題