【问题标题】:double to int (or long, long long) conversion sometimes is not gooddouble 到 int(或 long、long long)的转换有时并不好
【发布时间】:2012-10-15 14:00:38
【问题描述】:

我正在尝试将相当大的双精度数转换为 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) 有谁知道为什么会发生这种情况以及如何正确转换?

P。 S. 我正在尝试实现退格键值(例如 123.45,之后它应该是 12.34)。也许有人已经实现了这样的东西?

【问题讨论】:

    标签: objective-c ios int double


    【解决方案1】:

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

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

    即而不是 5.50 英镑,存储 550 便士。这样一来,您将永远不会遇到任何舍入问题。

    【讨论】:

    • 这是迄今为止唯一正确的答案。浮点数不准确。如果您正在处理您知道所需精度的事物(如货币),请将其存储为整数。
    • 但是这个四舍五入不公平,我知道四舍五入是什么,但为什么90变成89?这没有任何意义
    • 这告诉我你对浮点数没有太多经验:) 你说price = 12345678.900000 但它可能存储为12345678.90000000001 因为浮点存储中的舍入错误。通常这些错误非常小,但有时它们会累积并导致像您现在看到的错误。如果您想要绝对精度,请使用整数。另外,这个网站很有趣:floating-point-gui.de
    【解决方案2】:

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

    一种可能的解决方案是像 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
    

    【讨论】:

      猜你喜欢
      • 2014-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-20
      • 1970-01-01
      • 2013-09-25
      相关资源
      最近更新 更多