2

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

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

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

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

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

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

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

float SomeVariable = (float) 12.525D;

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

4

3 回答 3

7

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

您可以告诉编译器 12.502 实际上是一个浮点数,您可以通过添加 F 或 f 后缀来执行此操作,如下所示:

float someVariable = 12.502f;

或者:

double someVariable = 12.502;
于 2013-01-12T09:23:29.727 回答
1

你为什么不使用:

float someVariable = 12.502f;

或者

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

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

float可以从1.5 × 10^-45to取值3.4 × 10^38

double可以从 5.0 × 10^-324to取值1.7 × 10^308

所以你可以看到双打可以存储更大范围的值。因此,如果您转换doublefloat您可能会丢失信息。

于 2013-01-12T09:20:21.923 回答
0

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

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

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

于 2013-01-12T10:24:03.073 回答