我正在做某事,但遇到了一个我不明白的问题。
double d = 95.24 / (double)100;
Console.Write(d); //Break point here
控制台输出为 0.9524(如预期的那样),但如果我在停止程序后查看“d”,它将返回 0.95239999999999991。
我已经尝试了所有可能的演员,结果是一样的。问题是我在其他地方使用了“d”,而这个精度问题使我的程序失败了。
那么它为什么这样做呢?我该如何解决?
使用十进制而不是双精度。
http://en.wikipedia.org/wiki/Floating_point#Accuracy_problems
不足之处在于浮点数以相当于以 2 为底的科学记数法存储。有一个整数有效位被理解为在小数点前有一位,它被提高到 2 的整数幂。这允许以相对紧凑的格式存储数字;缺点是从基数 10 到基数 2 的转换会引入错误。
为了减轻这种情况,每当需要低幅度的高精度时,请使用decimal
而不是double
; decimal 是一种 128 位浮点数类型,旨在具有非常高的精度,但以缩小范围为代价(它只能表示高达 +- 79 nonillion、7.9E28 的数字,而不是 double 的 +- 1.8E308;对于大多数非天文、非物理计算机程序)和双倍的内存占用量。
一篇很好的文章,描述了很多:What Every Computer Scientist Should Know About Floating-Point Arithmetic它与 C# 无关,但与一般的浮点运算有关。
您可以改用小数:
decimal d = 95.24 / 100m;
Console.Write(d); //Break point here
尝试:
double d = Math.Round(95.24/(double)100, 4);
Console.Write(d);
编辑:或者使用小数,是的。我只是想让答案尽可能与问题相似:)