以下让我感到困惑 -
如果你将float
与10(integer
)相乘,看看发生了什么,
这些类型的操作似乎也很奇怪!
#include <iostream>
using namespace std;
int main()
{
float x1 = 0.1;// x1 *10 = 1 ture
float x2 = 0.7;//x2 *10 = 7 false answer give 0.6
float x3 = 0.8;//x3 *10 = 8 true
float x4 = 0.9;// x4 * 10 = 9 false ops! the answer is 8
int f = x4 * 10 ;
cout<<f ;
return 0;
}
任何人都可以解释一下吗?
答案 0 :(得分:3)
因为您尝试将结果保存到int
,而不是float
。这将关闭浮动部分,仅保留整数部分,例如(int) 6.999 = 6
。
如果你想获得 预期的 结果,你至少应该围绕它:
int f = x4 * 10 + 0.5;
^^^^^
| +0.5 here to round it
注意:由@JamesKanze评论,因为有multiple definitions of rounding,+0.5
可能不适用于负数(使用{{1而不是)。为了让您的工作更轻松,自-0.5
以来您还可以使用std:round()
。
或者将其保存为应有的内容,即C++11
:
float
P.S。:要继续阅读,请查看What Every Computer Scientist Should Know About Floating-Point Arithmetic。
答案 1 :(得分:0)
你使用int作为f的类型,因此精度会丢失。试试:
float f = x4 * 10.0;
再试一次。
答案 2 :(得分:0)
浮点数总是向下舍入(13.999999是13作为int)。浮点运算会受到较小的舍入误差。试试这个:
int f = (x4 * 10) + 0.5;
它只适用于正数,但证明了如何做这种事情。
答案 3 :(得分:-1)
浮点数不能完全代表数字。例如,考虑表达式 1/3
您要将乘法结果赋值为整数变量。在这种情况下,浮点数被截断,因为它的分数被抛弃。
改为使用
float f = x4 * 10 ;