C# 浮点数到小数点,小数点到浮点数。一般而言,所有转换

C# 浮点数到小数点,小数点到浮点数。一般而言,所有转换,c#,type-conversion,C#,Type Conversion,我在学习C。我完全不知道为什么,这里的正确答案是什么。我找了很多,什么也没找到。人们解释,但却找不到解释。正确答案是什么?为什么 在以下哪种转换过程中可能会出现精度损失 a。将整型转换为浮点型 b。将浮点转换为长浮点 c。将long转换为int d。将整型转换为长型 e。将浮点转换为十进制 f。将十进制转换为浮点 为什么浮点到十进制和十进制到浮点都可能丢失精度转换 在以下哪种转换过程中可能会出现精度损失? A.将整型转换为浮点型 int具有32位精度,完全用于数字的非小数部分float具有3

我在学习C。我完全不知道为什么,这里的正确答案是什么。我找了很多,什么也没找到。人们解释,但却找不到解释。正确答案是什么?为什么

在以下哪种转换过程中可能会出现精度损失

  • a。将整型转换为浮点型
  • b。将浮点转换为长浮点
  • c。将long转换为int
  • d。将整型转换为长型
  • e。将浮点转换为十进制
  • f。将十进制转换为浮点
为什么浮点到十进制和十进制到浮点都可能丢失精度转换

在以下哪种转换过程中可能会出现精度损失?

A.将整型转换为浮点型

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

例如:

int i = int.MaxValue; // = 2147483647
float f = (float)i;   // = 2147484000 --> lost last three digits!
float f = 1f / 3;
decimal d = 1M / 3;
float f2 = (float)d;
b。将浮点转换为长浮点

我希望您可以很容易地了解从浮点类型到整数类型的转换是如何失去精度的

c。将long转换为int

你的书没有提到这是一个问题,这表明它区分了精度损失和精度损失(仅供参考)

在C#中,
long
是64位,而
int
只有32位。任何大于
int.MaxValue
(即
2147483647
)的数字都不能用
int
表示,但许多这样的数字可以用
long
表示。将任何此类数字从
long
转换为
int
将导致精度损失,即所得数字甚至不接近正确数字

可以说,它也失去了精确性,但我猜你的书关注的是只失去精确性的情况

d。将整型转换为长型

我想你明白为什么这不会失去精确性

e。将浮点转换为十进制
F将十进制转换为浮点

为什么浮点到十进制和十进制到浮点都可能丢失精度转换

decimal
float
更容易解释:我们甚至在第一位使用
decimal
的原因是因为普通的
float
数值类型不能简单地表示
decimal
可以表示的某些值,这些值对于常见类型的计算(例如货币计算)很重要,而对于其他值
decimal
也不能表示,它至少可以更接近地表示它们

例如:

int i = int.MaxValue; // = 2147483647
float f = (float)i;   // = 2147484000 --> lost last three digits!
float f = 1f / 3;
decimal d = 1M / 3;
float f2 = (float)d;
在上面,变量
f
的值为
0.3333333 43
,而变量
d
的值为
0.3333
。两者都不精确(因为1/3是一个重复的十进制,它不能用有限的计算机来表示),但是
十进制版本更接近正确答案

同样,从
decimal
转换回
float
会导致精度损失,因为变量
f2
的值与
f
的值相同:
0.3333333 43

但是从
浮点
十进制
的转换呢

好的,
decimal
float
具有更高的精度有效位数(大约28对7),而
float
类型支持的数字大小为
1.401298E-45
(即
float.Epsilon
)。但是,
decimal
不能表示大小如此之小的数字(它只能表示大小大约为
1E-28
)。将
浮点
数值转换为小于
十进制
所能表示数值的数值,将导致数值
0
,丢失那些有效的十进制数字

换句话说:
float
只有7位精度,
decimal
有28位精度,
float
可以比
decimal
更进一步地将这些数字移到小数点的右边,允许
float
中的数值小于
decimal
所能代表的数值

因此,无论哪种方式都有可能失去精度(这就是为什么C#中没有这些类型之间的隐式转换……它只在不丢失信息的情况下提供隐式转换)

另请参见:




但是长到整数会以什么方式导致精度损失呢?当你提到“丢失精度”时,你实际上指的是潜在的损失,考虑长值<代码> 12345 67 8900L < /代码>。在
int
中是多少?-55什么,什么。书上说ABEF是正确的答案。为什么?写得很漂亮。我祝你一切顺利,非常感谢你的解释。我一定会检查这些链接以及。