铸造变化的价值奇怪

时间:2011-08-14 13:26:39

标签: c++ casting

为什么{(1}}而不是a1=72在这个(可怕的)C ++代码片段中?

73

您可以在http://codepad.org/HhGwTFhw

执行此操作

4 个答案:

答案 0 :(得分:8)

如果提高输出精度,您会看到(a - (int) a)打印0.7299999999999898

因此,此值的truncation(您将其投放到int时获得的值)确实是72

(更新了键盘here。)

答案 1 :(得分:5)

这是一个常见的精确问题。文字136.73实际上代表数字

136.729999999999989768184605054557323455810546875

并且a-(int)a的结果不是0.73(即使这是显示的内容),而是

0.729999999999989768184605054557323455810546875

当你将其乘以100时,你会得到

72.9999999999989768184605054557323455810546875

由于从double转换为int会切断小数点后的所有内容,因此会得到72

答案 2 :(得分:4)

0.73无法准确表示,因此会四舍五入到接近它的数字,在此示例中,该数字低于0.73。当乘以100时,得到72.[something],稍后会将其修剪为72

more info

答案 3 :(得分:4)

如果您阅读以下文章可能会很清楚:What Every Computer Scientist Should Know About Floating-Point Arithmetic

其他人已经证明(a - (int)a)的结果并不完全是0.73,而是略低一点。文章解释了为什么。这不是一个简单的阅读,但实际上每个与FP合作的人都应该阅读并试图理解,IMO。