Single singleVal = 0.9f;
int u = (int)(singleVal * 10.0f); # u = 8
我知道这可能是一个愚蠢的错误,但我无法弄清楚为什么上面的表达式的结果是8.我认为这显然是9。在c#中我们没有注意到他们的特殊事情吗?
答案 0 :(得分:2)
这与如何计算浮点数并以二进制形式存储有关。如果您执行if ((3/10 - 2/10) == 1/10)
,则实际上会获得false
,因为计算机获得的值为3.0000000001
。
这是因为1/10
无法以十进制二进制形式写入。它类似0.0011
,其中0011
位会永远重复。
它与1/3
在我们的数字系统中作为小数点重新排列的方式类似。我们通常0.333333334
。这会导致许多奇怪和恼人的问题。
如果您想要更准确的数字,请使用decimal
。十进制数实际上存储在十进制数中,而不是基数2,所以这种东西不会发生。但请注意,这些速度较慢。