c#中单个(浮点数)乘法的意外结果

时间:2018-05-18 21:23:42

标签: c# floating-point integer expression

Single singleVal = 0.9f;
int u = (int)(singleVal * 10.0f); # u = 8

我知道这可能是一个愚蠢的错误,但我无法弄清楚为什么上面的表达式的结果是8.我认为这显然是9。在c#中我们没有注意到他们的特殊事情吗?

1 个答案:

答案 0 :(得分:2)

这与如何计算浮点数并以二进制形式存储有关。如果您执行if ((3/10 - 2/10) == 1/10),则实际上会获得false,因为计算机获得的值为3.0000000001

这是因为1/10无法以十进制二进制形式写入。它类似0.0011,其中0011位会永远重复。

它与1/3在我们的数字系统中作为小数点重新排列的方式类似。我们通常0.333333334。这会导致许多奇怪和恼人的问题。

如果您想要更准确的数字,请使用decimal。十进制数实际上存储在十进制数中,而不是基数2,所以这种东西不会发生。但请注意,这些速度较慢。