【问题标题】:Unexpected result from multiplication of singles(floats) in c# [duplicate]c#中单数(浮点数)乘法的意外结果[重复]
【发布时间】:2018-05-18 21:23:42
【问题描述】:
Single singleVal = 0.9f;
int u = (int)(singleVal * 10.0f); # u = 8

我知道这可能是一个愚蠢的错误,但我不明白为什么上述表达式的结果是 8。出于明显的原因,我认为它会是 9。他们在 c# 中发生了一些我没有注意到的特殊情况吗?

【问题讨论】:

  • 欢迎使用浮点数。玩得开心把你的头发扯下来:youtube.com/watch?v=PZRI1IfStY0
  • This answer 将帮助您更好地理解。使用Single (float) 您只会得到一个近似值(因为该值存储为二进制点类型)。您可能要更改为Decimal (decimal)(存储为小数点类型)

标签: c# floating-point integer expression


【解决方案1】:

这与浮点数的计算方式和二进制存储方式有关。如果你做了if ((3/10 - 2/10) == 1/10),你实际上会得到false,因为计算机得到的值是3.0000000001

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

这类似于1/3 在我们的数字系统中不能被改写为小数。我们通常使用0.333333334。这会导致很多奇怪和烦人的问题。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 2023-02-26
    • 1970-01-01
    • 2022-01-05
    • 1970-01-01
    • 2012-12-10
    相关资源
    最近更新 更多