gpt4 book ai didi

iphone - 我应该如何在从 UISlider 读取的核心数据中存储百分比值?

转载 作者:可可西里 更新时间:2023-11-01 05:39:19 27 4
gpt4 key购买 nike

滑块是我的应用程序的主要用户交互元素(请看图...)。我使用它们来记录百分比值,然后将其作为 Reading 存储在我的核心数据存储中。根据百分比值的性质,我会将它们存储为 0 到 1 之间的十进制值,并将滑块设置为从 0 到 1 的范围,并连续触发其更改值的操作。当我需要显示它们时,我从数据存储中获取它们并将它们显示为典型的百分比值,例如67%

现在这里有一个问题: valueUISlider 属性是 float 类型。这意味着我会从一开始就遇到舍入错误。我对准确性很着迷,所以我希望在我的整个应用程序中处理它们时尽可能地减少误差幅度。

有哪些选项可以管理我从滑块上读取的百分比值、存储在 Core Data 中并显示在我的应用程序的其余部分中?或者更好的是,就 代码可维护性 内存使用/性能 获得的值的 准确性而言,我提出的哪些选项最适合我的应用程序?

  • 使用原始浮点数或 double 数

    实际上这是 BAD ,显然是因为舍入错误。甚至 0.64 在某个时间点也会变成 0.63(我已经用我的滑块进行了测试,这些出现了很多)。差异可能高达 0.01,我的应用程序绝对不能容忍这一点。为什么我什至要把它写成一个选项?
  • 将滑块范围设置为 0 到 100 之间,读取它们,向上/向下舍入并存储为整数

    这是一个有趣的选择,因为我只会将值显示为 ##% 而不是 0.## 。我也不需要对这些值执行算术运算,所以这样做看起来没问题:
    // Recording and storing
    // Slider range is 0 to 100
    int percentage = (int) floor(slider.value); // Or ceil()
    [reading setValue:[NSNumber numberWithInt:percentage]]; // Value is an integer

    // Displaying
    NSNumber *val = reading.value;
    [readingLabel setText:[NSString stringWithFormat:@"%d%%", [val intValue]]];

    当我第一次从我的滑块上读取它们时,这不会完全消除舍入错误(它们仍然是 float s!),但我认为 floor()ceil() 应该减少它。不过我并不完全确定;也许这里有人可以提供更多见解,这就是我提出这个问题的目的。
  • 转换并存储为 NSDecimalNumber 对象

    我查看了 NSDecimalNumber 类——毕竟百分比是基数为 10 的因素——但鉴于它产生不可变对象(immutable对象),我不太确定我是否喜欢在我的代码中重复编写长方法调用并创建到处都是自动释放的对象。

    甚至从原语中创建 NSDecimalNumber 也是一种痛苦。目前我只能想到这样做:
    // Recording and storing
    // Slider range is 0 to 1
    NSDecimalNumber *decimalValue = [NSDecimalNumber decimalNumberWithString:
    [NSString stringWithFormat:@"%0.2f",
    slider.value]];
    [reading setValue:decimalValue]; // Value is a decimal number

    将它们乘以 100,因为我将它们显示为 ##% (就像我上面说的)也变得非常乏味,并创建了不必要的额外对象,然后将这些对象转换为 NSString s。我会继续,但我可能会把这篇文章变成一篇咆哮,这绝对不是我想要的。

    话虽如此,语义上 NSDecimalNumber 应该最有意义,因为正如我上面所说,我相信百分比应该存储为 0 和 1 之间的十进制值。但是,看看我的应用程序如何处理百分比值,我不知道是选择将它们乘以 100 并存储为整数还是使用 NSDecimalNumber

  • 您可能会看到我已经稍微倾向于第二个选项(x100,使用整数),因为它更方便,并且看起来性能稍好一些。但是,我想看看是否有人认为第三个更好(更具 future 证明?)。

    顺便说一句,我不介意修改我的数据模型以更改 value 实体中 Reading 属性的数据类型,并修改我现有的代码以适应更改。我还没有做太多事情,因为我已经把剩下的时间都花在了担心这个问题上。

    您认为我应该选择上述哪个选项?

    最佳答案

    如果您需要做的只是从滑块读取、保存值并显示它们,那么我会推荐处理源自缩放的、舍入的浮点滑块输入的原始整数。无论如何,滑块并不是那么精确的输入法,因此您的用户不会注意到舍入是否与滑块头的像素位置不完全匹配。

    我会在这里使用与您在确定有效数字位数时所做的相同类型的推理,该计算将真实世界的数据作为其输入(如温度读数等)。如果您的输入源只有两位数的精度,则将计算报告为四位有效数字是没有意义的。

    NSDecimals 和 NSDecimalNumbers 当你想对十进制值执行更多扩展计算,但又想避免浮点错误时,就需要用到 NSDecimals 和 NSDecimalNumbers。例如,在我的应用程序中运行高精度计算或需要以某种方式操纵货币时,我会使用它们。在这两者中,我坚持使用 NSDecimal for performance reasons ,在需要与 Core Data 交互或需要将数值导入 NSDecimal 结构的场合使用 NSDecimalNumber。

    在这种情况下,NSDecimal 似乎有点矫枉过正,因为您并没有真正以任何方式调整滑块值,只是在屏幕上显示它们。如果您确实需要执行以后的操作(减半,运行公式等),我建议将滑块四舍五入为整数表示,从中创建一个 NSDecimal 结构,作为 NSDecimals 执行计算,然后使用NSDecimal/NSDecimalNumber 的字符串输出例程以在屏幕上显示结果。然后,您可以轻松地将计算出的值保存为 Core Data 中的 NSDecimalNumber,或者保存为 SQLite 或其他文件中的字符串表示形式。

    另外,我不会太担心像这样的简单计算的性能,直到像 Instruments 这样的东西告诉你它们是一个热点。很可能,这些使用 NSDecimal 等的计算不会。

    关于iphone - 我应该如何在从 UISlider 读取的核心数据中存储百分比值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4521409/

    27 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com