2012-05-04 34 views
1

我正在处理某些事情,并且遇到了一个我不明白的问题。除以100精度

double d = 95.24/(double)100; 
Console.Write(d); //Break point here 

控制台输出是0.9524(如预期),但如果我看向采空返回0.95239999999999991程序后,“d”。

我试过每一个可能的转换,结果是一样的。问题是我在别处使用'd',这个精度问题使我的程序失败。

那么它为什么这样做呢?我该如何解决它?

+1

在SO –

+0

上有这么多像这样的浮点数问题猜测Double.ToString的默认格式只显示4个第一位小数。如果你想要一个精确的表示(float和double不是精确的表示),你应该移动到十进制类型 –

回答

6

http://en.wikipedia.org/wiki/Floating_point#Accuracy_problems

短的它是一个浮点数字存储在什么相当于2为底的科学记数法。有一个整数有效位数被理解为在小数点前面有一个位置,它被提升为2的整数次幂。这允许以相对紧凑的格式存储数字;缺点是从基数10到基数2的转换会导致错误。

为了缓解这种情况,无论何时需要在低幅度下的高精度,请使用decimal而不是double;十进制是一种128位浮点数类型,其设计精度非常高,代价是缩小了范围(它只能表示数字高达+ - 79非零,7.9E28,而不是double的+ - 1.8E308;仍然很多用于大多数非天文学,非物理学计算机程序)和双倍的内存占用。

+0

+1回答他的问题 - 为什么以及如何解决 –

7

使用decimal而不是双。

+0

它的工作!非常感谢 ! – PuK

1

你可以使用一个decimal代替:

decimal d = 95.24/100m; 
Console.Write(d); //Break point here 
1

尝试:

double d = Math.Round(95.24/(double)100, 4); 

Console.Write(d); 

编辑:或者使用小数,是的。我只是试图保持答案与问题类似:)