提问者:小点点

浮点数C#


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

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

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

双类型的文字不能隐式转换为“浮点”类型;使用“F”后缀创建此类型的文字。

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

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

为了修复编译器错误,我显式强制转换了赋值语句:

float SomeVariable = (float) 12.525D;

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


共3个答案

匿名用户

简单地说,编译器为文本字符串12.502假定的默认类型是double。双精度是浮点数的两倍,就像夸脱装不下一品脱一样,双精度不能存储在浮点数中,除非你做强制转换,否则会有丢失精度的风险。

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

float someVariable = 12.502f;

或者:

double someVariable = 12.502;

匿名用户

你为什么不使用:

float someVariable = 12.502f;

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

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

flot可以取1.5×10^-453.4×10^38的值

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

因此,您可以看到double可以存储更大范围的值。因此,如果您从double转换为flot,您可能会丢失信息。

匿名用户

如果您编写floatyVariable=(floaty)12.525D;,则十进制数字首先转换为双精度,然后转换为浮点数。在极少数情况下,根据数字,此双舍入会略微改变值。

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

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