除以100精度

时间:2012-05-04 15:04:35

标签: c# double precision divide

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

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

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

我已经尝试了每一次演员,结果是一样的。问题是我在其他地方使用'd',这个精度问题使我的程序失败。

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

5 个答案:

答案 0 :(得分:7)

使用decimal代替双倍。

答案 1 :(得分:6)

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

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

为了缓解这个问题,每当需要低精度的高精度时,请使用decimal代替double;十进制是128位浮点数类型,设计具有非常高的精度,以降低范围为代价(它只能表示高达+ - 79 nonillion,7.9E28,而不是double的数字+ - 1.8E308;仍然足够大多数非天文,非物理计算机程序)和双倍的内存占用量。

答案 2 :(得分:2)

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

答案 3 :(得分:1)

您可以使用decimal代替:

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

答案 4 :(得分:1)

尝试:

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

Console.Write(d);

编辑:或者使用小数,是的。我只是想尽可能地回答问题:)