mid*_*lue 88 c++ floating-point rounding
可能重复:
C++中float的round()
我有一个双(称为x),意味着55,但实际存储为54.999999999999943157,我刚才意识到.
所以,当我这样做
double x = 54.999999999999943157;
int y = (int) x;
Run Code Online (Sandbox Code Playgroud)
y = 54而不是55!
这困惑了我很久了.如何让它正确圆?
Mor*_*itz 115
在转换之前添加0.5(如果x> 0)或减去0.5(如果x <0),因为编译器将始终截断.
float x = 55; // stored as 54.999999...
x = x + 0.5 - (x<0); // x is now 55.499999...
int y = (int)x; // truncated to 55
Run Code Online (Sandbox Code Playgroud)
C++ 11还引入了std :: round,它可能使用类似的逻辑将0.5添加到| x | 引擎盖下(如果感兴趣,请参阅链接),但显然更强大.
后续问题可能是为什么 float没有完全存储为55.有关解释,请参阅此 stackoverflow答案.
MK.*_*MK. 46
铸造不是一种数学运算,也不是这样的.尝试
int y = (int)round(x);
Run Code Online (Sandbox Code Playgroud)
转换为int截断值.添加0.5使其进行适当的舍入.
int y = (int)(x + 0.5);
Run Code Online (Sandbox Code Playgroud)
小智 5
值得注意的是,您所做的不是四舍五入,而是铸造。使用(int) x强制转换会截断 的十进制值x。在您的示例中,如果x = 3.9995,.9995则被截断,而x = 3.
正如许多其他人提出的那样,一种解决方案是添加0.5到x,然后进行强制转换。
| 归档时间: |
|
| 查看次数: |
337916 次 |
| 最近记录: |