这是我的问题:
如果我们有以下值
0.59144706948010461
我们尝试将其转换为Single我们会收到下一个值:
0.591447055
正如你所看到的,这不是我们应该得到的。您能解释一下这个价值是如何创造的,我该如何避免这种情况?
谢谢!
答案 0 :(得分:6)
正如你所看到的,这不是我们应该接受的。
为什么不呢?我强烈怀疑这是你给Single
的最近Double
值。
从Single
的文档中修正了错字:
所有浮点数的有效位数都有限,这也决定了浮点值接近实数的准确程度。
Single
值的精度最多为7位小数,但内部最多保留9位数。
限制为7位有效数字时,Double
的值为0.5914471 - 您获得的Single
值也是如此。您原来的Double
值 0.59144706948010461 ... Double
和Single
值的完全值为:
Double
:0.5914470694801046146693579430575482547283172607421875 Single
:0.591447055339813232421875 了解二进制浮点的工作原理非常重要 - 请参阅binary floating点上的文章和decimal floating点以获取更多背景信息。
答案 1 :(得分:0)
从double转换为float时,你也会四舍五入。结果应该是最接近您要舍入的数字的单精度数。
这正是你在这里得到的。
0.5到1之间的浮点数的格式为n / 2^24
,n
位于2^23
和2^24
之间。
0.59144706948010461... = 9922835.23723472274456576... / 2^24
所以最接近的单精度浮点数是
9922835 / 2^24 = 0.5914470553...