在Objective C中将double转换为long long

时间:2014-10-27 07:53:18

标签: objective-c double

我的代码非常简单:

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 个答案:

答案 0 :(得分: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)));

答案 1 :(得分: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的全部目的是提供一种不受十进制数字限制的机制,不能表示为双精度数或浮点数。它往往会消除你的代码似乎瞄准的那种技巧。