double to int(或long,long long)转换有时不好

时间:2012-10-15 14:00:38

标签: objective-c ios int double

我试图将相当大的双数转换为int(或长或长),但有一些困难。几乎总是转换好,但有时不好:

我的代码:

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

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

P上。 S.我试图实现退格到值(e.x. 123.45,之后应该是12.34)。也许有人已经实现了这样的东西?

2 个答案:

答案 0 :(得分:2)

如果您使用的是浮点数,那么您总是会遇到舍入错误的风险。

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

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

答案 1 :(得分:0)

如评论所述,由于可能存在错误,我会小心舍入。

一种可能的解决方案是使用谷歌这样的双打与Android中的坐标:将它们乘以1E6。如果使用整数操作,那么与使用双精度操作相比,您将获得更多的CPU周期。试试这个:

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