【问题标题】:Floating point numbers C#浮点数 C#
【发布时间】:2012-12-26 20:19:39
【问题描述】:

我的印象是,以这种格式声明和初始化浮点数是合法且常规的:

float someVariable = 12.502D;  (or M, F does not give a compiler error).

但是我得到一个编译器错误:

double类型的文字不能隐式转换为'float'类型;使用“F”后缀来创建这种类型的文字。

C# 中的浮点数分为三种类型,对吧?

  1. F 或 f 表示浮点数。 (7 位有效数字)
  2. D 或 d 表示双精度。 (15 或 16 位有效数字)
  3. M 或 m 表示十进制。 (28 或 29 位有效数字)

为了修复编译器错误,我明确地转换了赋值语句:

float SomeVariable = (float) 12.525D;

在这种情况下我做对了吗?声明和初始化由 Double 或 Decimal 值组成的浮点变量的常规或正确方法是什么?

【问题讨论】:

  • 为什么不按照编译器的建议使用F?然后不需要强制转换(隐式或显式)......
  • 或者,如果你想要一个 double 变量,那么声明它为 double SomeVariable = 12.525D; 将它声明为一种类型并使用不同类型的文字是没有意义的。跨度>
  • FWIW,如果您使用十进制,请注意这不是硬件支持的类型,即一切都在软件中完成,这使得它更准确但不是很快。但就像其他人说的,为什么不用 12.502f 而不是 12.502d?

标签: c# floating-point


【解决方案1】:

在简单的英语中,编译器为文本字符串 12.502 假定的默认类型是 double。 double 的大小是 float 的两倍,就像 quart 不能放入一品脱一样,double 不能存储在 float 中,除非您进行强制转换,否则会降低精度。

你可以告诉编译器 12.502 实际上是一个浮点数,你可以通过像这样添加 F 或 f 后缀来做到这一点:

float someVariable = 12.502f;

或者:

double someVariable = 12.502;

【讨论】:

    【解决方案2】:

    你为什么不使用:

    float someVariable = 12.502f;
    

    double someVariable = 12.502; //floating point literals are by default doubles
    

    float 是单精度浮点运算,在 C# 中不能隐式转换为 double。 在 C# 中,每个可能丢失某些信息的强制转换都不能是隐式的。 float 有 32 位来存储浮点精度的分量。 double 有 64 位。

    float 可以取值从1.5 × 10^-453.4 × 10^38

    double 可以取值从5.0 × 10^-3241.7 × 10^308

    所以你可以看到双精度数可以存储更大范围的值。 因此,如果您从double 转换为float,您可能会丢失信息。

    【讨论】:

    • 你是说反过来吗? :]
    • 我不知道他到底想要double还是float
    • 谢谢,我想我误解了整个浮点概念。我在想 Decimal 和 Double 是 float 的子数据类型,但 float、Decimal 和 Double 都是独立且独立的数据类型。感谢简单的英文解释。
    【解决方案3】:

    如果你写float SomeVariable = (float) 12.525D;,那么十进制数字首先转换为双精度数,然后再转换为浮点数。在极少数情况下,根据数字,这种双舍入会稍微改变值。

    用 F 后缀写数字可以避免这种情况。

    (如果数字在某种意义上是均匀分布的,这将在 230 中发生一次,因为浮点有效数中的位比双有效数中的位少 29 位。问题发生在原始数字以双精度形式四舍五入到浮点舍入的中点 [一次在 229] 但如果直接舍入为浮点数,则从该中点向另一个方向舍入被四舍五入为[二分之一]。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-08
      • 2011-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-12
      • 2010-12-19
      • 2017-11-16
      相关资源
      最近更新 更多