我正在处理某些事情,并且遇到了一个我不明白的问题。除以100精度
double d = 95.24/(double)100;
Console.Write(d); //Break point here
控制台输出是0.9524(如预期),但如果我看向采空返回0.95239999999999991程序后,“d”。
我试过每一个可能的转换,结果是一样的。问题是我在别处使用'd',这个精度问题使我的程序失败。
那么它为什么这样做呢?我该如何解决它?
我正在处理某些事情,并且遇到了一个我不明白的问题。除以100精度
double d = 95.24/(double)100;
Console.Write(d); //Break point here
控制台输出是0.9524(如预期),但如果我看向采空返回0.95239999999999991程序后,“d”。
我试过每一个可能的转换,结果是一样的。问题是我在别处使用'd',这个精度问题使我的程序失败。
那么它为什么这样做呢?我该如何解决它?
http://en.wikipedia.org/wiki/Floating_point#Accuracy_problems
短的它是一个浮点数字存储在什么相当于2为底的科学记数法。有一个整数有效位数被理解为在小数点前面有一个位置,它被提升为2的整数次幂。这允许以相对紧凑的格式存储数字;缺点是从基数10到基数2的转换会导致错误。
为了缓解这种情况,无论何时需要在低幅度下的高精度,请使用decimal
而不是double
;十进制是一种128位浮点数类型,其设计精度非常高,代价是缩小了范围(它只能表示数字高达+ - 79非零,7.9E28,而不是double的+ - 1.8E308;仍然很多用于大多数非天文学,非物理学计算机程序)和双倍的内存占用。
+1回答他的问题 - 为什么以及如何解决 –
你可以使用一个decimal代替:
decimal d = 95.24/100m;
Console.Write(d); //Break point here
描述了很多很好的文章:What Every Computer Scientist Should Know About Floating-Point Arithmetic它不涉及到C#,而是在普通浮法算术。
尝试:
double d = Math.Round(95.24/(double)100, 4);
Console.Write(d);
编辑:或者使用小数,是的。我只是试图保持答案与问题类似:)
在SO –
上有这么多像这样的浮点数问题猜测Double.ToString的默认格式只显示4个第一位小数。如果你想要一个精确的表示(float和double不是精确的表示),你应该移动到十进制类型 –