C# 除以100的精度

C# 除以100的精度,c#,double,precision,divide,C#,Double,Precision,Divide,我正在做一件事,我有一个我不明白的问题 double d = 95.24 / (double)100; Console.Write(d); //Break point here 控制台输出为0.9524(如预期),但如果我在停止程序后查看“d”,它将返回0.9523999999991 我尝试了所有可能的方法,结果都是一样的。问题是我在其他地方使用了“d”,这个精度问题使我的程序失败 那么它为什么会这样做呢?如何修复它?使用,而不是双精度。 它的缺点是,浮点数存储在以2为基数的科学记数法中。有一

我正在做一件事,我有一个我不明白的问题

double d = 95.24 / (double)100;
Console.Write(d); //Break point here
控制台输出为0.9524(如预期),但如果我在停止程序后查看“d”,它将返回0.9523999999991

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

那么它为什么会这样做呢?如何修复它?

使用,而不是双精度。

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

为了缓解这种情况,每当需要低震级的高精度时,使用
十进制
,而不是
双精度
;decimal是一种128位浮点数类型,其设计具有非常高的精度,但代价是缩小了范围(它只能表示高达+-79Nonion,7.9E28的数字,而不是double的+-1.8E308;对于大多数非天文、非物理计算机程序来说仍然足够)并将内存占用空间增加一倍。

您可以使用:


这是一篇很好的文章,描述了很多内容:它与C#无关,而是与浮点运算有关。

试试:

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

Console.Write(d);

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

在猜测默认格式Double.ToString只显示4个第一位小数时,这里有很多这样的浮点数问题。如果需要精确表示,则应移到十进制类型(float和double不是精确表示)
double d = Math.Round(95.24/(double)100, 4);

Console.Write(d);