C++:如何将double四舍五入为int
C++: How to round a double to an int?
我有一个双精度(称为x),本应为55,但实际上存储为54.99999999943157,我刚刚意识到这一点。
所以当我做时
double x = 54.999999999999943157;
int y = (int) x;
y=54而不是55!
这使我困惑了很长一段时间。如何使其正确舍入?
在强制转换之前加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
C++11还引入了std::round,它可能使用类似的逻辑,在引擎盖下向|x|添加0.5(如果感兴趣,请参阅链接),但显然更健壮。
后续问题可能是为什么浮点值没有精确存储为55。有关解释,请参阅此stackoverflow答案。
铸造不是一个数学运算,也不是这样。尝试
int y = (int)round(x);
强制转换为int
会截断该值。添加0.5
会使其进行适当的舍入。
int y = (int)(x + 0.5);
值得注意的是,您所做的不是舍入,而是强制转换。使用(int) x
进行强制转换会截断x
的十进制值。在您的示例中,如果x = 3.9995
,则.9995
将被截断,x = 3
将被截断。
正如许多其他人所提出的,一种解决方案是将0.5
添加到x
,然后进行强制转换。
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
double x=54.999999999999943157;
int y=ceil(x);//The ceil() function returns the smallest integer no less than x
return 0;
}
相关文章:
- 为什么在全局范围内使用"extern int a"似乎不行?
- int(c) 和 c-'0' 之间的区别。C++
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 在C++中,将大的无符号浮点数四舍五入为整数的最佳方法是什么
- 为什么野牛仍在使用"int yylex(void)",却找不到"int yylex(YYS
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- 请解释这句话(cout<<1+int((a<b)^((b-a)&1) )<<endl
- 是否可以从int转换为enum类类型
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 向量 <int> a {N, 0} 和 int arr a[N] = {0} 的时间复杂度有什么区别
- 'short int'持有的值溢出,但"自动"不会溢出?
- 如何在C++中将一个无符号的 int 转换为两个无符号的短裤?
- 调用'begin(int [n])'没有匹配函数
- 没有显式声明的int[]中的foreach
- 在c++中访问int到类对象的映射时出错
- 为什么我无法更改"set<set>"循环中的值<int>
- 长 长 int 不要 长 int 好
- C++程序在循环后给出奇怪的int值
- 为什么将双精度转换为 int 似乎在第 16 位数字之后将其四舍五入?
- C++:如何将double四舍五入为int