浮动投射将值减少1

时间:2011-02-16 08:34:03

标签: c++ casting floating-point

当转换(浮动)33554329L时,结果为33554328.如果该数字然后被转换为long,则该值保持在33554328,对此有任何解释。

在C ++中使用VS2005 [非托管]

4 个答案:

答案 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)

阅读this

“每个计算机科学家都应该了解浮点数”

http://www.validlab.com/goldberg/paper.pdf

答案 2 :(得分:2)

Floats对于高(30亿+)数字的精确度非常低。

Float的精度在0-1范围内最佳。从零开始越远,精度越低。而在大约30亿,它甚至不足以保持每个整数(因此它舍入到它可以表示的最接近的值)。

解决方案:使用double(或decimal representation)。

答案 3 :(得分:1)

各种浮点类型的表示精度因其大小而异。对于32位浮点数,您可以预期大约7位精度。对于double,它大约是16位数。

我强烈建议您阅读浮点表示以及各种优缺点。从长远来看,它会为你省去很多麻烦,特别是当比较之类的东西不像你期望的那样工作时。