浮点到小数,小数到浮点.一般情况下的所有转换
本文关键字:小数 转换 情况下 | 更新日期: 2023-09-27 18:21:14
我正在学习C#。我完全不知道为什么,正确答案是什么。我找了很多却一无所获。人们解释,但找不到任何解释。正确答案是什么?为什么?
在以下哪种转换过程中可能会出现精度损失?
- a。将int转换为float
- b。将浮点转换为长
- c。将long转换为int
- d。将int转换为long
- e。将浮点值转换为十进制
- f。将十进制转换为浮点
为什么浮点到小数和小数到浮点都有可能丢失精度转换。。?
在以下哪种转换过程中可能会出现精度损失
a.将int转换为浮点
int
具有32位精度,完全用于数字的非小数部分。float
具有32位精度,但其中一些位用于指数,留下不到32位来表示尾数。因此,存在可以表示为int
但不能表示为float
的数字。
例如:
int i = int.MaxValue; // = 2147483647
float f = (float)i; // = 2147484000 --> lost last three digits!
b。将浮点转换为长
我希望您可以很容易地了解从浮点到整数类型的转换是如何丢失精度的。
c。将long转换为int
你的书没有提到这一问题,这表明它区分了精度损失和精度损失(仅供参考)。
在C#中,long
是64位,而int
只有32位。任何大于int.MaxValue
(即2147483647
)的数字都不能用int
表示,但许多这样的数字可以用long
表示。将任何这样的数字从long
转换为int
将导致准确性的损失,即所得到的数字甚至不接近正确的数字。
可以说,它也失去了的精度,但我想你的书关注的是只有精度丢失的情况?
d。将int转换为long
我想你明白为什么这不会失去准确性。
e。将浮点值转换为十进制
f.将小数转换为浮点
为什么浮点到小数和小数到浮点都有可能丢失精度转换。。?
decimal
到float
更容易解释:我们之所以使用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
相同的值:0.333333343
。
但是从float
到decimal
的转换呢?
好吧,虽然decimal
比float
有更多的有效精度数字(约28比7),但float
类型支持大小小到1.401298E-45
的数字(即float.Epsilon
)。但decimal
不能表示如此小幅度的数字(它只能表示大约1E-28
那么小的幅度)。转换幅度小于decimal
所能表示的float
数字将导致0
的值,丢失那些有效的十进制数字。
换句话说:虽然float
只有7位精度,而decimal
有28位精度,但float
可以将这些数字移动到比decimal
更靠小数点右侧的位置,从而使float
中的星等数比decimal
所能表示的更小。
因此,无论哪种方式都可能失去精度(这就是为什么C#中这些类型之间没有隐式转换的原因…它只在没有信息丢失的情况下提供隐式转换)。
另请参阅:
显式数字转换表(C#引用)
单一结构
十进制结构
.NET中小数、浮点和双精度的区别?