2015-11-09 148 views
2

我正在学习学习C#。我完全丧失了为什么以及这里的正确答案。我搜查了很多,什么都没找到。人们解释,但没有解释被发现。什么是正确的答案,为什么?浮点到十进制和十进制浮点。所有转换一般

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

  • a。将int转换为浮点数
  • b。将浮点数转换为长整数
  • c。将长整型转换为整型
  • d。将一个int转换为长整数
  • e。将浮点数转换为小数点
  • f。将小数转换为浮点数

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

+0

但是以什么方式做了长时间的精度为int原因引起?它没有。 – MakerOfTheUnicake

+1

每当你提到“精确度损失”时,你实际上是指潜在的损失 – cleftheris

+0

是的,这就是对的。 – MakerOfTheUnicake

回答

2

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

a。将int转换为浮点数

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

例如:

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

湾将浮点数转换成长整数

我希望您能够轻松看到浮点到整数类型的转换如何失去精度。

c。转换一个长为int

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

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

可以说,它有失去精度,但我猜你的书的重点是哪里精度丢失的情况?

d。将一个整数转换成长整数

我假设你理解为什么这不会失去精度(或精度)。

e。将浮点数转换为小数点
f。将小数转换为浮点数

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

decimalfloat有点容易解释:我们甚至在第一时间使用decimal的原因是因为正常的float数字类型根本无法代表decimal可以的,哪些是重要的,常见的某些价值观的计算(例如货币计算),而其他值也不能代表它至少能代表它们更接近。

例如:

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

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

类似地,从decimalfloat结果转换中精度的损失,作为可变f2卷取用相同的值,该值的确f0.333333343

但是从float转换为decimal怎么样?

好,而decimal具有精度比float确实(约28 VS 7)中,float类型支持数字与幅度小1.401298E-45(即float.Epsilon)更显著数字。但decimal不能代表具有如此小幅度的数字(它只能表示与约1E-28一样小的数值)。转换float数字的幅度小于decimal可以表示的数字将导致值为0,丢失那些重要的十进制数字。

换句话说:当float只具有精度7位和decimal有28个,float可以更远移动这些数字的小数点右边比decimal可以,允许使用更小幅度的号码floatdecimal能代表。因此,无论哪种方式都有可能导致精度下降(这就是为什么在这些类型之间C#中没有隐式转换,只有在没有信息丢失时才提供隐式转换)。

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

+0

感谢您的回答,我会立即阅读。 – MakerOfTheUnicake

+0

写得很漂亮。我祝你最好,我非常感谢你的解释。我一定会查看这些链接。 – MakerOfTheUnicake