1

这是我的问题:

如果我们有以下值

0.59144706948010461

我们尝试将其转换为 Single 我们收到下一个值:

0.591447055

正如你所看到的,这不是我们应该收到的。您能否解释一下这个价值是如何产生的,我该如何避免这种情况?

谢谢!

4

2 回答 2

7

正如你所看到的,这不是我们应该收到的。

为什么不?我强烈怀疑这是与您给出的最接近的Single值。Double

从 的文档中Single,修复了错字:

所有浮点数都有有限数量的有效数字,这也决定了浮点值与实数近似的准确程度。一个Single值最多具有 7 位十进制数字的精度,但内部最多保留 9 位数字。

当限制为 7 位有效数字时,您的Double值为 0.5914471 -Single您获得的值也是如此。您的原始Double值也不完全是0.59144706948010461 ...和值的确切值是:DoubleSingle

  • Double: 0.5914470694801046146693579430575482547283172607421875
  • Single: 0.591447055339813232421875

了解一点二进制浮点的工作原理很重要 - 请参阅我关于二进制浮点十进制浮点的文章了解更多背景信息。

于 2013-11-14T15:10:21.927 回答
0

从 double 转换为 float 时,您也在四舍五入。结果应该是最接近四舍五入数字的单精度数字。

这正是你在这里得到的。

介于 0.5 和 1 之间的浮点数具有介于 和之间的n / 2^24形式。n2^232^24

0.59144706948010461... = 9922835.23723472274456576... / 2^24

所以最接近的单精度浮点数是

9922835 / 2^24 = 0.5914470553...
于 2013-11-14T15:12:49.930 回答