【问题标题】:Looking for an easier way to use floats in C#寻找在 C# 中使用浮点数的更简单方法
【发布时间】:2009-07-20 14:11:34
【问题描述】:

出于多种原因,我必须在代码中使用浮点数而不是双精度数。要在我的代码中使用文字,我必须编写如下内容:

float f = 0.75F;

否则编译器会出错,因为它只将“0.75”视为双精度数。有什么我可以放入我的代码或在 Visual Studio 中设置的东西,可以让它将像“0.75”这样的文字视为浮点数,而不必每次都附加一个“F”?

【问题讨论】:

  • 加油!您必须定义多少个浮点常量?如果很多,只需使用几次查找和替换。
  • 我同意@leppie。无论如何,你真的应该限制这样的文字。如果您正在执行大量默认分配,并且通常是相同的值,请将它们移动到某个静态内部类中并以这种方式引用它们。此外,您可以使用小写 f 而不是大写 F 来表示浮点文字,从而节省您的 shift 键击。如果你在意。 :)
  • 听起来很酷的应用程序!
  • 是的,在大多数应用程序中,您总是需要双精度或十进制,因此“浮点”不是默认值。 (坦率地说,如果十进制是默认值,我会更喜欢它,因为更多的人进行财务计算而不是科学计算。)在许多 CPU 中,所有操作都是以双精度完成的,所以浮点数并不快,而且在大多数应用程序中,额外的四个字节不重要。我可以看到在手持设备上这两个条件都不满足,因此使用浮动变得更加明智。
  • 问题是一些框架(我不会提到名字,但想想一个以X开头并由大型软件公司制作的游戏开发框架)使用float只要有可能,几乎每个数字的末尾都附有一个小 F。 :(

标签: c# .net floating-point double


【解决方案1】:

没有 - 幸运的是,IMO。文字在所有地方都以相同的方式处理。

这是一件好事 - 假设某个维护开发人员会在一年后来查看您的代码。他看到“0.75”并认为“我知道 C# - 那是双精度数!等等,它是如何分配给浮点变量的?”艾克。

到处加“F”真的那么痛苦吗?你真的有那么很多常量吗?您能否将它们提取为 常量值,以便所有“F 后缀”文字都在同一个位置。

【讨论】:

  • 正如我在对原始问题的评论中提到的,我同意;限制你的文字并将它们提取为常量以获得最大的可维护性。
  • 割腕不痛,但很烦人。我所做的主要是实验性的,涉及调整参数值和测试结果。有时公式中有很多这些,所以有很多 F 忘记添加。
  • 然后在你的测试中使用双精度,稍后切换到浮点数。
  • 考虑从配置文件中读取它们。这使得调整算法更容易,并且您可以省略尽可能多的 f。
  • @peterchen:我不仅在调整输入算法的值 - 我也在调整和更改算法本身。在这个阶段,从配置文件中提供它们将是一个不必要的额外步骤。
【解决方案2】:

仅供参考——您可以在 http://msdn.microsoft.com/en-us/library/6ds95cz0.aspx 找到 C# 的所有编译器选项。如果您检查那里,您会发现没有任何选项允许这样做 - 由于@Jon Skeet 指出的原因,这是正确的。

【讨论】:

    【解决方案3】:

    该语言将浮点精度文字解释为无处不在的双精度值。这不是编译器的可配置功能 - 并且有充分的理由。

    配置语言解释代码的方式会导致兼容性和维护开发人员理解代码含义的能力方面的问题。

    虽然一般不建议使用,但您可以通过以下方式在 C# 3 中稍微减轻痛苦:

    var f = 0.75F;
    

    请小心,因为在这种语法中忘记“F”后缀会导致编译器创建一个双精度数,而不是一个浮点数。

    【讨论】:

    • 这并没有减轻那种痛苦。我仍然需要输入 F。
    • 这是我不会出于您所描述的原因使用 var 语法的地方。另一方面,我会使用双打,而不是浮动......
    • 某些语言允许重新定义如何使用宏解释代码,例如 C。它没有包含在 C# 中,因为它不是很有用,而且很容易把它弄得一团糟。 :)
    • var 方法在这里感觉有点危险。 float f = 0.75; 至少会让编译器做出反应;感觉就像一个很好的安全网。
    • @FredrikMörk:如果编译器遵循这样的原则,即从更具体的类型到不太具体的可比较域类型的转换正在扩大(即隐式允许),而从不太具体的类型到更具体的类型的转换需要强制转换,float f=0.75; 甚至 float f=0.1; 将在没有 squawk 的情况下编译,但 double f=0.1f; 会在没有显式类型转换的情况下发出 squawk(例如 double f = (double)0.1f;。不幸的是,Java 实现了后向规则,.net 紧随其后。
    【解决方案4】:

    Float 带有一个 F :-)

    【讨论】:

      【解决方案5】:

      我建议你总是使用

      var meaning = 1f;
      

      因为“var”关键字节省了大量人工解释和维护时间。

      【讨论】:

      • 我不确定这是否真的可以节省任何人工解释 - 迫使我查看类型的末尾(f),而不是让我依赖具有类型的正常 c# 约定be first 为错误留出更多空间,并且需要更长的 imo。
      【解决方案6】:

      正确的行为不是让编译器将非后缀文字解释为单精度浮点数,而是认识到从 double 到 float 的转换应该被视为扩大转换,因为对于每个 double 值,都有或者恰好是一个明确正确的float 表示,或者(在少数罕见的边缘情况下)将恰好有两个同样好的值,这两个值都不会超过每千万亿分之一作为明确正确的值。从语义上讲,从floatdouble 的转换应该被视为缩小转换(因为它们要求编译器“猜测”它没有的信息),但是可能会导致在该方向进行转换的实际困难'扩大'。

      也许有人应该请求微软增加从doublefloat 的扩大转换?在调用绘图函数时,没有充分理由说明计算图形坐标为 double 的代码应该与类型转换混为一谈。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2023-04-10
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-05-19
        相关资源
        最近更新 更多