C# c中单值(浮点数)乘法的意外结果#
我知道这可能是一个愚蠢的错误,但我不明白为什么上面表达式的结果是8。我想应该是9点,原因很明显。它们在c语言中有什么特别的东西,我没有注意到吗?这与浮点数的计算和二进制存储方式有关。如果你做了C# c中单值(浮点数)乘法的意外结果#,c#,floating-point,integer,expression,C#,Floating Point,Integer,Expression,我知道这可能是一个愚蠢的错误,但我不明白为什么上面表达式的结果是8。我想应该是9点,原因很明显。它们在c语言中有什么特别的东西,我没有注意到吗?这与浮点数的计算和二进制存储方式有关。如果你做了If((3/10-2/10)=1/10)你实际上会得到false,因为计算机得到的值是3.0000000001 这是因为1/10不能作为十进制二进制写入。它类似于0.0011,其中0011位永远重复 这类似于在我们的数字系统中,1/3不能作为小数点重排。我们通常做0.33333333 4。这会引起很多奇怪和
If((3/10-2/10)=1/10)
你实际上会得到false
,因为计算机得到的值是3.0000000001
这是因为1/10
不能作为十进制二进制写入。它类似于0.0011
,其中0011
位永远重复
这类似于在我们的数字系统中,1/3
不能作为小数点重排。我们通常做0.33333333 4
。这会引起很多奇怪和恼人的问题
如果您想要更精确的数字,请使用
十进制
。十进制数字实际上是以10为基数存储的,而不是以2为基数,所以这种事情不会发生。但是请注意,这些速度较慢 这与浮点数的计算和二进制存储方式有关。如果你做了If((3/10-2/10)=1/10)
你实际上会得到false
,因为计算机得到的值是3.0000000001
这是因为1/10
不能作为十进制二进制写入。它类似于0.0011
,其中0011
位永远重复
这类似于在我们的数字系统中,1/3
不能作为小数点重排。我们通常做0.33333333 4
。这会引起很多奇怪和恼人的问题
如果您想要更精确的数字,请使用
十进制
。十进制数字实际上是以10为基数存储的,而不是以2为基数,所以这种事情不会发生。但是请注意,这些速度较慢 欢迎使用浮点数。开心地把你的头发扯下来:这会帮助你更好地理解。使用Single
(float
)只能得到近似值(因为该值存储为二进制点类型)。您可能需要更改为十进制(Decimal
)(存储为小数点类型)欢迎使用浮点数。开心地把你的头发扯下来:这会帮助你更好地理解。使用Single
(float
)只能得到近似值(因为该值存储为二进制点类型)。您可能希望更改为Decimal
(Decimal
)(存储为小数点类型)
Single singleVal = 0.9f;
int u = (int)(singleVal * 10.0f); # u = 8