2014-10-27 74 views
1

我的代碼是非常簡單的:轉換雙待很長很長的目標C

long long GetAmountFromString(NSString* string){ 
    NSLog(@"double value %f", [string doubleValue]); 
    NSLog(@"double value * 100 %f", [string doubleValue]*100); 
    NSLog(@"long long %lld", (long long)([string doubleValue]*100)); 
    return (long long)([string doubleValue]*100); 
} 

int main(int argc, const char * argv[]) { 
    @autoreleasepool { 
     GetAmountFromString(@"4324.69"); 
    } 
    return 0; 
} 

然而,它的輸出是奇怪:

double value 4324.690000 
double value * 100 432469.000000 
long long 432468 

我想到的是342469.誰能告訴我正確的做這份工作的方式?

回答

2

通常十進制值不能用浮點類型精確表示。因此,雙倍值* 100實際上小於432469.將其舍入以獲得您期望的結果。

double round(double number) 
{ 
    return number < 0.0 ? ceil(number - 0.5) : floor(number + 0.5); 
} 

NSLog(@"long long %lld", (long long)(round([string doubleValue]*100))); 
0

嘗試使用NSDecimalNumber。

NSString* string = @"4324.69"; 
NSDecimalNumber* value = [NSDecimalNumber decimalNumberWithString: string]; 
value = [value decimalNumberByMultiplyingBy: [NSDecimalNumber decimalNumberWithMantissa:1 
                     exponent:2 
                     isNegative:NO]]; 
NSLog(@"value %@", [value descriptionWithLocale:[NSLocale currentLocale]]); 

編輯: NSDecimalNumber的全部目的是提供一種機構,它不會受到十進制數不能表示爲雙打或浮動。它傾向於消除你的代碼似乎瞄準的那種技巧。