浮点到十进制,十进制浮点数。一般的所有转换

时间:2015-11-09 09:14:15

标签: c# type-conversion

我正在学习学习C#。我完全不知道为什么以及这里的正确答案是什么。我搜索得很多,一无所获。人们解释说,但没有找到解释。什么是正确的答案以及为什么?

以下哪项转换可能会导致精度下降?

  • 一个。将int转换为float
  • 湾将浮点数转换为长
  • ℃。将long转换为int
  • d。将int转换为long
  • 即将浮点数转换为小数
  • F。将小数转换为浮点数

为什么浮动到十进制和十进制都浮动可能会失去精度转换..?

1 个答案:

答案 0 :(得分:3)

  

以下哪项转换可能会导致精度下降?

  一个。将int转换为float

int具有32位精度,完全用于数字的非小数部分。 float具有32位精度,但这些位中的一些用于指数,留下少于32位来表示尾数。因此,有些数字可以表示为int,但不能表示为float

例如:

int i = int.MaxValue; // = 2147483647
float f = (float)i;   // = 2147484000 --> lost last three digits!
  

湾将浮点数转换为长

我希望你很容易看到从浮点到整数类型的转换如何失去精确度。

  

℃。将long转换为int

你的书没有提到这是一个问题,这表明它的精确度损失与精确度的损失(仅供参考)。

在C#中,long是64位,而int只是32位。任何大于int.MaxValue的数字(即2147483647)都不能由int表示,但许多此类数字可由long表示。将任何此类号码从long转换为int将导致准确性下降,即结果数字甚至不接近正确的数字。

可以说它失去了精确度,但我想你的书专注于精度丢失的情况?

  

d。将int转换为long

我假设您理解为什么这不会失去精确度(或准确性)。

  

即将浮点数转换为小数
  F。将小数转换为浮点数


  为什么浮动到十进制和十进制以浮动可能的精度转换损失..?

decimalfloat稍微容易解释一下:我们首先使用decimal的原因是因为普通float数字类型根本无法解决表示decimal可以存在的某些值以及哪些值对于常见的计算类型(例如货币计算)很重要,而对于其他值decimal也不能表示它至少可以更接近地代表它们。

例如:

float f = 1f / 3;
decimal d = 1M / 3;
float f2 = (float)d;

在上文中,变量f的值为0.333333343,而变量d的值为0.3333333333333333333333333333。两者都不准确(因为1/3是重复的小数,它不能由有限的计算机表示),但decimal版本更接近正确的答案。

同样,从decimal转换回float会导致精度下降,因为变量f2最终会与f的值相同:{{ 1}}。

但是从0.333333343float的转换呢?

嗯,虽然decimal的精确位数比decimal更高(约28比7),但float类型支持的数字幅度小到float (即1.401298E-45)。但是float.Epsilon不能代表具有如此小幅度的数字(它只能表示小到大约decimal的幅度)。将1E-28数字转换为小于float可以表示的数字将导致值decimal,从而丢失那些有效的十进制数字。

换句话说:虽然0只有7位精度而float有28位,decimal可以将这些数字移动到小数点右边比{{1}更远的位置允许float中比decimal更小的数字可以表示。

因此,可能会失去任何一种方式的精度(这就是为什么在这些类型之间没有C#中的隐式转换......只有在没有信息丢失的情况下才提供隐式转换。)

另见:
Explicit Numeric Conversions Table (C# Reference)
Single Structure
Decimal Structure
Difference between Decimal, Float and Double in .NET?