【问题标题】:Incorrect result when dividing an integer over a float将整数除以浮点数时结果不正确
【发布时间】:2012-02-10 12:21:26
【问题描述】:

我正在研究 Objective C,我正在尝试推断二维数组的正确索引。

为此,我有几个按钮设置标签,将两个索引合并为一个数字。例如,数组中的位置 1,1 导致标记 = 11。

之后要取消合并索引的两个组件,我使用以下代码:

float tag = (float)[sender tag];

    float x = [[NSString stringWithFormat:@"%.2f", tag / 10.f] floatValue];
    //float x = (float)tag / 10.f;

    int y = floor (x);

    int z = (x - y) * 10;

这个理论很好,但是当我得到这些结果时我很惊讶:

标签 = 23 x = 2.29999995 而不是 2.3 的预期结果(23 / 10 = 2.3 而不是 2.2999995)!

我也尝试过两次和多次操作都没有成功。

谁知道我做错了什么?

谢谢。

【问题讨论】:

  • 这与“Objective-C”无关,它只是普通的“C”和浮点运算的工作方式。

标签: objective-c floating-point divide


【解决方案1】:

使用整数算术。浮点数不能完全准确地表示所有数字,尤其是非整数值。

[sender tag] 为 23 的示例:

int senderTag = 23;
int tagA = senderTag / 10;
int tagB = senderTag % 10;
NSLog(@"senderTag: %d, tagA: %d, tagB: %d", senderTag, tagA, tagB);

NSLog 输出:

senderTag: 23, tagA: 2, tagB: 3

【讨论】:

  • Niiice,但我不明白如何 :( 以及为什么 :(((
  • 整数除法会截断,因此除以 10 将删除最低有效数字:(23/10) == 2。'%' 是模运算符,与长除法中的余数基本相同介于 0 和模值 1 之间的数字,在本例中为 0-9:(23%10) == 3。
【解决方案2】:

尤其是像 1/3、1/5 这样的分数不能用浮点运算正确表示。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-07
    • 2016-05-02
    • 1970-01-01
    • 1970-01-01
    • 2012-10-22
    • 2013-11-24
    相关资源
    最近更新 更多