当转换(浮动)33554329L时,结果为33554328.如果该数字然后被转换为long,则该值保持在33554328,对此有任何解释。
在C ++中使用VS2005 [非托管]
答案 0 :(得分:7)
32位浮点尾数为23位,为8,388,608个不同的值。这意味着精度大约是7位有效小数。您的号码有8位十进制有效数字,因此您可以看到最后一位有效数字的精度损失 Here's More information on float representation
双精度为64位,尾数为52位,即4,503,599,627,370,496(16位数),因此具有大约15-16的十进制数字精度。
decimal
类型可能允许您以任何精度保存任意数量的任何长度。 C#有它们但不幸的是它们不是C ++中的原始类型。您可以找到一些在C ++中实现它们的第三方库。
答案 1 :(得分:5)
答案 2 :(得分:2)
Floats对于高(30亿+)数字的精确度非常低。
Float的精度在0-1范围内最佳。从零开始越远,精度越低。而在大约30亿,它甚至不足以保持每个整数(因此它舍入到它可以表示的最接近的值)。
解决方案:使用double(或decimal representation)。
答案 3 :(得分:1)
各种浮点类型的表示精度因其大小而异。对于32位浮点数,您可以预期大约7位精度。对于double,它大约是16位数。
我强烈建议您阅读浮点表示以及各种优缺点。从长远来看,它会为你省去很多麻烦,特别是当比较之类的东西不像你期望的那样工作时。