浮点到Int的转换
Float to Int conversion
我正在读取小数点后两位的"浮点"数字,例如:
122
122.3
122.34
并且需要通过乘以(想象存储美元/美分)将它们转换为整数值
int i;
double d;
scanf( "%lf", &d );
i = d * 100;
例如18.56
将被转换为1855
有没有什么方法可以将value读取为double并正确地转换为int?
TIA
通过舍入转换为int的最简单方法:
i = (int)floor(d * 100 + 0.5);
如果你的数字总是正数:
i = (int)(d * 100 + 0.5);
介于1.565和1.575之间的值将变为157。介于2.135和2.145之间的值将变为214。
这样,如果你有一个像1.56999这样的数字,它就会变成157。
这并不能"解决精度损失"——不管这意味着什么。它只是圆的。
如果一个值正好在两个数字之间(例如d是1.125),那么您可能会得到意外的结果。在这种情况下,所有数字都只有两位小数,所以这不是问题。如果数字不局限于小数点后几位,你应该更仔细地考虑如何处理像1.125这样的数字。
问题是,您对float的转换(通过scanf
)是一个近似值,它正在丢失预期的精确十进制值。改为使用:
int dollars = 0, cents = 0;
scanf("%d.%d", &dollars, ¢s);
cents += 100*dollars;
或类似的。
存储在浮点中的值将四舍五入。乘以10的幂只会放大误差。如果你不想有任何舍入误差,你需要立即将值读取为整数,如果你需要值乘以的因子,可能会跟踪小数点的位置:
std::string tmp;
if (std::cin >> tmp) {
std::string::size_type decimal_point = tmp.rfind('.');
int power(0);
if (decimal_point != tmp.npos) {
tmp.erase(tmp.begin() + decimal_point);
power = int(decimal_point) - int(tmp.size());
}
int value;
if (std::istringstream(tmp) >> value) {
std::cout << "read " << value << "e" << power << "n";
}
}
这段代码只处理相对简单的浮点数,但肯定会处理您引用的形式的浮点数。
另一种选择是使用小数浮点,在处理十进制值时不会出现舍入问题。遗憾的是,它们还没有作为标准C++库的一部分提供。然而,有些编译器确实提供了处理十进制浮点的扩展。
如果您确定数字最多有两个数字,并且大小适中,则将它们读取为double
,乘以100,四舍五入到最接近的整数将产生正确的结果。(简单地将double
强制转换为整数会截断,而不是四舍五入到最接近的整数,有时会由于浮点舍入错误而产生不正确的结果。您可以使用round
函数进行舍入。)
使用double
以这种方式处理输入不一定是最佳方法。
OP几乎已经拥有了它,只需要添加round()
和错误检查。
round()
很好地四舍五入到最近值,与0打平。
12.34这样的值将产生1234。
由于FP问题,12.345等1/2美分边界的值可能会返回1234或1235,但OP 3的例子没有超过0.01。
+或-数字没有问题。
#include <math.h>
...
int i;
double d_dollars;
double d_cents;
if (1 != scanf( "%lf", &d_dollars)) handle_error();
d_cents = round(d_dollars * 100.0);
if ((d_cents < INT_MIN) || (d_cents > INT_MAX)) handle_error();
i = (int) d_cents;
- 从"int*"强制转换为"unsigned int"会丢失精度错误
- 是否可以从int转换为enum类类型
- 如何在C++中将一个无符号的 int 转换为两个无符号的短裤?
- 功能样式转换从 'int' 到 'ItemType' 的匹配转换
- 将 int 数组转换为 std::vector<int*>
- 如何转换 int 变量并附加到常量 wchar_t*
- 类型转换<int>的舍入问题
- 在Objective-C中调用sqlite3数据库时,如何调用和转换int/NSNumber
- 转换 int -> 无符号长 长 是否由标准定义
- 简单的 int 到字符串转换..int to const char* 无效
- 如何将转换 int 除法键入为浮点数
- C++类型转换 int * 到类
- 预期的类型说明符,并且无法在初始化时转换“int*”
- 转换int并将其与char*连接
- 字符串流在转换int型时添加新行
- 转换int为字符串/char c++ /Arduino
- c# P-Invoke:如何转换INT fun(BYTE *bStream, UINT16 *nCount, const
- 类型转换(int**)和int(*)的区别
- 从"int"到"nodeType"的无效转换<int>
- 从无符号int构造对强制转换int的引用