0

我正在尝试将相当大的双数转换为 int(或 long 或 long long),但有一些困难。几乎总是它转换得很好,但有时不是:

我的代码:

double price = 12345678.900000;
double hundredNumber = price * 100;
NSNumber *number = [NSNumber numberWithDouble:hundredNumber];
int tempNumber = [number intValue];

一切顺利,直到 tempNumber。它注销 1234567889,但它应该是 1234567890 (... 89 - ... 90 ) 有谁知道它为什么会发生以及如何正确转换?

PS我正在尝试实现退格键值(例如123.45,之后应该是12.34)。也许有人实施过这样的事情?

4

2 回答 2

2

如果您使用浮点数,您总是会面临舍入错误的风险。

为什么不总是将价格存储为long long?

即,而不是 5.50 英镑,存储 550 便士。这样你就永远不会有任何舍入问题。

于 2012-10-15T14:06:07.230 回答
0

正如评论的那样,由于可能存在错误,我会小心舍入。

一种可能的解决方案是像 Google 在 Android 中使用坐标那样使用双精度数:将它们乘以 1E6。如果您使用整数操作,那么您将比使用双精度操作更安全。试试这个:

double priceDouble = 33.f / 34.f;
NSLog(@"double: %f", priceDouble);

NSInteger priceInteger = (NSInteger)(priceDouble * 1E6);
NSLog(@"int: %d", priceInteger);

NSNumber * priceNumberWithDouble = [NSNumber numberWithDouble:priceInteger];
priceDouble = [priceNumberWithDouble doubleValue];
NSLog(@"double: %f", priceDouble);

NSNumber * priceNumberWithInteger = [NSNumber numberWithInteger:priceInteger];
priceInteger = [priceNumberWithInteger integerValue];
NSLog(@"int: %d", priceInteger);

double test = ((double)priceInteger)/1E6;
NSLog(@"Test: %f",test);

我的输出如下:

double: 0.970588
int: 970588
double: 970588.000000
int: 970588
Test: 0.970588
于 2012-10-15T15:12:15.203 回答