0

在这种情况下,我的“f”值总是从 88 到 108,我需要将该值映射到从 0 到 200 的搜索栏范围

我在这里展示的表达式在所有值上都很好,除了 if f=88.1,88.2,89.1;89.2....等等

String value = b.getText().toString();

    float f= Float.parseFloat(value);


    int progress = (int) (f-(float)88.0)*10;
    s.setProgress( progress);

我在搜索栏中设置了我的进度,我像这样取回了我的 f 值并设置了一个文本视图

float channel = (float) ((float)88.0 + ((float)progress/10));
            String mytext=Float.toString(channel);
            t.setText(mytext);

但是 textview 显示的值比我原来的值少 0.1;如显示 f=88.1 为 88.2,f=88.0 为 88.1 等等......

有人可以帮我解决这个问题吗?

我得到了解决方案,并将其标记为正确,但是谁能告诉我为什么会发生这种奇怪的事情?

4

2 回答 2

2

您是否尝试过相反的检查。乘以 10,然后减去 880,看看问题是否仍然存在。

int progress = (int) ((f*10) - 880);
于 2012-09-14T07:46:15.500 回答
0

二进制浮点并不能准确地表示所有值。特别是,值 88.1、88.2、89.1 和 89.2 不能以二进制浮点数表示。相反,其精确数学结果将是这些值之一的任何计算或转换都会生成接近精确结果的二进制浮点值。

在通常的默认模式下,返回最接近精确结果的可表示结果。(这是针对执行的每个操作。当您有多个算术运算时,舍入到可表示结果的影响可能会复合,从而产生更大的差异。)有时可表示的结果大于确切的结果,有时它会更小。

因此,您的对象f不包含 88.1、88.2、89.1 或 89.2。它包含一些稍高或稍低的其他值。当您减去 88 并乘以 10 时,如果舍入的效果恰好取消并给您一个准确的结果,您可能正好有 1 或 2,但您可能有一个略高于 1 或 2 的值或一个值略低于 1 或 2。

然后使用强制转换将该值转换为整数(int)。这种转换会截断;它不圆。因此,如果该值略低于 1,则强制转换的结果为 0。

如果您希望将整数转换为舍入而不是截断,则可以添加 .5: int progress = (int) ((f-88.f)*10 + .5);。(如果您关心平局时的舍入方向,当与最近整数的距离完全相等时,您必须使用不同的解决方案。)

此四舍五入将缓解您在此问题中提出的特定问题,但仍可能出现伪影。例如,如果 f 非常接近某个值,例如 88.15,则将其四舍五入以产生 1(对于 .1)或 2(对于 .2)的进度,然后从该进度重构 f 可能会产生 88.2,即使 f 稍微接近一些到 88.1(略低于 88.15)或可能产生 88.1,即使 f 稍微接近 88.2(略高于 88.15)。

于 2012-09-14T13:15:36.620 回答