2

我正在做某事,但遇到了一个我不明白的问题。

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

控制台输出为 0.9524(如预期的那样),但如果我在停止程序后查看“d”,它将返回 0.95239999999999991。

我已经尝试了所有可能的演员,结果是一样的。问题是我在其他地方使用了“d”,而这个精度问题使我的程序失败了。

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

4

5 回答 5

8

使用十进制而不是双精度。

于 2012-05-04T15:07:54.280 回答
6

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

不足之处在于浮点数以相当于以 2 为底的科学记数法存储。有一个整数有效位被理解为在小数点前有一位,它被提高到 2 的整数幂。这允许以相对紧凑的格式存储数字;缺点是从基数 10 到基数 2 的转换会引入错误。

为了减轻这种情况,每当需要低幅度的高精度时,请使用decimal而不是double; decimal 是一种 128 位浮点数类型,旨在具有非常高的精度,但以缩小范围为代价(它只能表示高达 +- 79 nonillion、7.9E28 的数字,而不是 double 的 +- 1.8E308;对于大多数非天文、非物理计算机程序)和双倍的内存占用量。

于 2012-05-04T15:08:02.657 回答
2

一篇很好的文章,描述了很多:What Every Computer Scientist Should Know About Floating-Point Arithmetic它与 C# 无关,但与一般的浮点运算有关。

于 2012-05-04T15:09:21.680 回答
1

您可以改用小数

decimal d = 95.24 / 100m;
Console.Write(d); //Break point here
于 2012-05-04T15:08:23.077 回答
1

尝试:

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

Console.Write(d);

编辑:或者使用小数,是的。我只是想让答案尽可能与问题相似:)

于 2012-05-04T15:10:01.220 回答