2013-05-10 176 views
-1

我在C#中将Decimal转换为Double时遇到了问题。 而不是0.3我得到0.2999999999999Visual Studio 2010 C#Double

当我调试一点点时,我已经看到转换不是问题。

查看打印屏幕和我的观察列表? http://i.imgur.com/rTUDfxo.png

有没有想法?

编辑: 答案:这是Visual Studio 2010的一些奇怪的行为。 重新启动后,一切都很好。

+1

浮点值 – 2013-05-10 08:40:13

+2

http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg。 html – 2013-05-10 08:42:02

+1

事实上,这个问题无法回答。 0.2999999999999与0.3的Double值一样有效。没有语境,没有人能告诉你为什么你观察的这些价值观是“错误的”。 – 2013-05-10 08:42:06

回答

2

0.3当存储二进制文件时有一个无限表示法:(0.) 00111111 11010011 00110011 00110011 00110011 00110011 00110011 00110011 .....无论是用32,64还是128位存储它,它都会在某个时刻切断。

当将其转换为双精度时,将失去精度。这就是为什么你得到0.2999999999 ...

这不是一个错误,它是简单的不可能存储无限精度。

+0

这是Visual Studio 2010的一些奇怪的行为。重新启动后,一切都很好。 – 2013-05-10 09:00:43

+1

请注意此标准:http://en.wikipedia.org/wiki/IEEE_floating_point IEEE-754 – 2013-05-10 09:12:28

1

该行为常见于双倍行为,因为它是floating binary type。 这两种类型保存的值在存储器中完全不同的,例如:

在浮子,所述计算机保存这样

10001.10010110011 

若干然而,在小数时,它存储这样

12345.65789 

这可能会导致数字差别很小,例如:

在浮动:

0.1 = 0.09999 

在十进制

0.l = 0.1