【问题标题】:"Correct" .Net Datatype for storing 0.0-1.0用于存储 0.0-1.0 的“正确”.Net 数据类型
【发布时间】:2012-10-19 00:29:54
【问题描述】:

我在很多地方都使用 0.0-1.0 范围。一些例子包括:

报告进度(0=开始,0.5=50% 完成,1=完成),2 个对象之间的比较(0=不匹配,0.95=非常相似,1=相同)等。

我更喜欢避免使用任何固定范围 (0-100) 内的整数,因为 a) 示例中的 100 感觉随意,b) 像 12.5 这样的非离散值呢?

目前,我使用 double 并强迫自己遵守 0<=x<=1 的约定

这很好用,但我现在正在编写一个支持插件的应用程序,插件报告处理进度。目前,这是由 double 报告的,如果值超出范围,应用程序将引发异常。我真正想要的是一种数据类型,它隐式地将值限制在 0-1 或 Min-Max 或类似范围内的任何值

注意:我知道所有数据类型都有最大分辨率。我也知道,在大多数情况下,整数 0-100 可能足够接近 - 但是正确的方法是什么?

【问题讨论】:

    标签: .net types


    【解决方案1】:

    使用枚举。否则你的代码会被magic numbers 弄得乱七八糟。

    【讨论】:

    • 枚举如何解决这个问题?使用枚举来表示最大范围?这感觉就像让插件开发人员在他们弄错时尝试一个值和异常一样糟糕......
    • 枚举对于您提供的示例非常有意义(0=开始,1=完成)(0=不匹配,1=相同)。如果您真正想要的是这两个限制之间的范围,我认为您并没有说得很清楚。
    • 我认为0<=x<=1 很清楚。无论如何,我的意思是例如 0 = 开始,0.25 = 25% 完成,0.75 = 75% 完成,1 = 100% 完成。
    【解决方案2】:

    如果插件在 Min 到 Max 范围内报告进度,您可以将其转换为 0-1 范围,如下所示:

    ((double) progressValue + (double) Min) / (double) (Max - Min)
    

    或者如果进度值更可能在 0 到 Max 的范围内,则简化为:

    (double) progressValue / (double) (Max)
    

    如果您与它保持一致,则进度报告的 0BackgroundWorker.ReportProgress 方法所使用的。

    对于使用整数值的进度报告通常足够精确 - 用户可能不太关心 12.5% 完成和 13% 完成之间的差异。

    对于您的其他示例,我通常也会使用 0 到 1 的范围来表示 0% 到 100% - 然后使用“P”格式说明符将其格式化为百分比。

    【讨论】:

    • 感谢您的信息,我很高兴将一个范围操作到另一个范围 - 这不是问题,我正在寻找具有隐式范围的数据类型
    【解决方案3】:

    我从来没有为他找到一个好的答案,但我决定使用0<=x<=Integer.MaxValue 范围内的整数。

    这并不理想,因为它不是特别易于阅读,但它确实隐含地强制执行有效范围并为大多数情况提供足够的分辨率。

    【讨论】:

      【解决方案4】:

      这里有几个不同的用例:

      1. 进度:0(开始)到 1(完成)。使用浮点数或双精度数。这可用于缩放进度条或显示为百分比(或两者兼有)。
      2. 比较:使用布尔值(true = 相同,false = 不相同)
      3. 在你的插件情况下,我会创建一个类似IProgressValue 之类的接口。包括用于从不同输入类型设置值的方法。

      【讨论】:

      • 我不相信我这样做... 1) 如果有人提供 1.5 的值会发生什么? 2)也许我不清楚,但这也是一个滑动比例(0.95 - 对象非常相似但不完全相同) 3)我不明白这有什么帮助 - 我的问题是我正在寻找一种隐含的类型范围
      • 1) 您显然还必须验证设置并且不允许值 >1。 2)你是对的,你没有说清楚;请用该信息更新问题。 3)这会将插件与您的类型实现的细节隔离开来,允许您在不同的情况下使用不同的实现。
      • 1) 已在 OP 中作为当前方法提及。 2)我添加了一个中间值,谢谢。 3)我到处使用接口,但仍然看不到你在做什么。你介意在接口中给出一个方法的例子吗?我只能看到void SetProgress(double Progress) 或类似的 - 这只是同一个问题?
      • 你是对的。由于您的 #2 是一个范围,因此它与 #1 几乎相同
      猜你喜欢
      • 2014-06-11
      • 2011-03-22
      • 2018-11-04
      • 1970-01-01
      • 2016-10-27
      • 1970-01-01
      • 2017-12-18
      • 2011-08-20
      • 1970-01-01
      相关资源
      最近更新 更多