我的代码非常简单:
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.谁能告诉我正确的工作方式?
答案 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的全部目的是提供一种不受十进制数字限制的机制,不能表示为双精度数或浮点数。它往往会消除你的代码似乎瞄准的那种技巧。