浮点数 C#

3
我认为以这种格式声明和初始化浮点数是合法且惯用的方式: ```float f = 3.14;```
float someVariable = 12.502D;  (or M, F does not give a compiler error).

然而我遇到了编译错误:
字面值 double 类型不能隐式转换为 'float' 类型;使用 'F' 后缀创建此类型的字面值。
在C#中有3种浮点数类型,对吗?
1. 使用 F 或 f 表示 float 型(7个有效数字); 2. 使用 D 或 d 表示 Double 型(15或16个有效数字); 3. 使用 M 或 m 表示 Decimal 型(28或29个有效数字)。
为了解决编译错误,我显式地添加了强制转换语句。
float SomeVariable = (float) 12.525D;

在这种情况下,我做得对吗?声明和初始化一个由Double或Decimal值组成的浮点变量的传统或正确方式是什么?


7
为什么不像编译器建议的那样使用"F"?那么就不需要进行任何强制类型转换(无论是隐式还是显式)... - mousio
2
或者,如果你想要一个 double 变量,就声明为 double SomeVariable = 12.525D;。把变量声明为一种类型,然后使用不同类型的字面值是没有意义的。 - Damien_The_Unbeliever
顺便提一下,如果您使用十进制,则应注意这不是硬件支持的类型,即所有操作都在软件中完成,这使得它更精确但不太快。但像其他人说的那样,为什么不使用12.502f而不是12.502d呢? - Rudy Velthuis
3个回答

7
用通俗易懂的语言来解释,编译器默认将文本字符串12.502作为双精度类型处理。双精度类型是浮点类型的两倍大小,就像夸脱装不进品脱一样,除非进行转换,否则双精度类型无法存储在浮点类型中,这会导致精度损失。
你可以告诉编译器12.502实际上是浮点数,方法是在数字后面添加F或f后缀,如下所示:
float someVariable = 12.502f;

或者:

double someVariable = 12.502;

1
为什么不使用:

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,则可能会丢失信息。


你是指反过来吗?:] - mousio
我不确定他需要 double 还是 float 的值。 - Ilya Ivanov
谢谢,我想我一直误解了浮点数的概念。我一直认为 Decimal 和 Double 是 float 的子集数据类型,但实际上 float、Decimal 和 Double 都是独立的数据类型。感谢您用通俗易懂的语言进行解释。 - PowerCoder

0

如果你写了float SomeVariable = (float) 12.525D;,那么这个小数首先会转换为double类型,然后再转换为float类型。在极少数情况下,根据这个数字,双重舍入会略微改变其值。

用F作为后缀的形式可以避免这种情况发生。

(如果数字在某种意义上是均匀分布的话,这种情况将会在大约2的30次方中发生一次,因为float有效数字比double有效数字少29位。当原始数字以double形式四舍五入到恰好是float舍入的中间点时就会出现问题[2的29次方中发生一次],但如果直接舍入到float,则从中间点舍入的方向与之相反[两次中发生一次]。)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接