这是一个愚蠢的问题。我正在使用System.Single的parse函数,它的行为异常,可能是因为我不太了解浮点数。 System.Single.MaxValue的MSDN页面指出最大值为3.402823e38,采用标准格式,即

340282300000000000000000000000000000000

如果我将此字符串用作Parse()方法的参数,它将成功执行而不会出现错误,如果我将任何零更改为任意数字,它仍将成功执行而不会出现错误(尽管在查看结果时似乎忽略了它们) 。据我了解,这超出了限制,所以我想念的是什么?

最佳答案

通过查看一些较低的数字可能更容易考虑这一点。直到16777216的所有(正)整数都可以用浮点数精确表示。在那之后,只能表示所有其他整数(直到下一次我们达到极限时为止,此时只能表示每第4个整数)。

因此,接下来要发生的是16777218必须代表16777218∓1,16777220必须代表16777220∓1,依此类推。当您向上移动更大的数字时,每个值必须“代表”的整数范围不断扩大越来越宽-直到340282300000000000000000000000000000000代表范围340282300000000000000000000000000000000∓100000000000000000000000000000000的所有点为止(实际上我还没有算出这里正确的∓值是多少,但希望您能理解点)

Number         Significand             Exponent

16777215 =   1 11111111111111111111111     2^0      = 111111111111111111111111
16777216 =   1 00000000000000000000000     2^1      = 1000000000000000000000000
16777218 =   1 00000000000000000000001     2^1      = 1000000000000000000000010
             ^
             |
             Implicit leading bit

关于c# - 使用Single.Parse()解析浮点数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23560675/

10-13 05:02