我想知道是否可以限制我们在浮点数中输入的字符数。 我似乎无法找到任何方法。我必须从外部接口读取数据,该接口发送xx.xx形式的浮点数据。截至目前,我正在使用转换为char,反之亦然,这是一个混乱的解决方法。有人可以提出改进解决方案的建议吗?
答案 0 :(得分:3)
如果您的数字总是只需要2个小数位,并且绝对大小不是一个大问题,那么为什么不在内部使用整数,而是将其含义设为“目标单位的第100位”。最后你只需要将它们转换回浮点并除以100.0就可以回到你想要的状态。
答案 1 :(得分:3)
这是一个轻微的误解。您不能将float或double视为十进制数。
大多数尝试将它用作固定的十进制精度数,例如2,都会产生问题,因为某些值不会精确地等于xxx.xx,但只是大致相等。
许多应用程序使用的一个解决方案是确保:
1)使用printf / sprintf可以很好地控制浮点数的显示到一定数量的有效数字,
2)没有在浮点数之间进行精确比较,即与精确度的第二小数点比较两个数a,b:通常应该使用abs(a-b)< = epsilon。直接平等是危险的,因为0.01可能具有多个浮点值,例如如果进行算术运算可能会产生0.0101和0.0103,但如果值被截断为2 dp,则可能无法区分用户,并且它们在逻辑上可能与您的应用程序等效,假设精度为2dp。
最后,我建议你使用double而不是float。这些天没有真正的开销,因为我们不再使用数学协处理器进行浮点运算了! 32位体系结构下的浮点数具有7个小数点的精度,而双精度数为15,这在很多情况下都很重要。
答案 2 :(得分:2)
将float
(即二进制浮点数)舍入为2 十进制数字没有多大意义,因为您不会无论如何,在某些情况下能够完全圆整,所以你仍然会得到一个小的delta,这会影响后续的计算。如果你真的需要它恰好是2个位置,那么你需要使用十进制算术;例如,使用IBM的decNumber++库,它实现了ISO C/C++ TR 24773 draft
答案 3 :(得分:1)
您可以限制要输出的有效数字的数量:
http://www.cplusplus.com/reference/iostream/manipulators/setprecision/
但我不认为有一个功能可以实际删掉一定数量的数字。您可以使用ftoa()(或stringstream)编写函数,删除一定数量的数字,并使用atof()(或stringstream)并返回该函数。
答案 4 :(得分:0)
您可以使用printf("%.2f", float)
或类似内容打印浮动使用。
答案 5 :(得分:0)
您应该检查字符串而不是转换后的float。检查位数会更容易。
答案 6 :(得分:0)
为什么不将浮子四舍五入到所需的精度?
double round(double val, int decimalPlaces)
{
double power_of_10 = pow(10.0, static_cast<double>(decimalPlaces));
return floor(val * power_of_10 + 0.5) / power_of_10;
}
int main()
{
double d;
cin >> d;
// round d to 3 decimal places...
d = round(d, 3);
// do something with d
d *= 1.75;
cout << setprecision(3) << d; // now output to 3 decimal places
}
答案 7 :(得分:0)
C中没有定点十进制数据类型,但您可以使用两个整数的结构模仿pascal的decimal
。
答案 8 :(得分:0)
如果需要取5个数字[包括或排除小数点],你可以简单地写下面。
scanf( "%5f", &a );
其中a被声明为float。
例如: 如果输入123.45,则scanf将考虑前5个字符,即4个数字和小数点&amp;将存储123.4 如果输入123456,则a的值将为12345 [~12345.00]
使用printf,我们可以控制小数点后可以打印多少个字符。
printf( "%5.2f \n", a );
123.4的值将打印为12.30 [总共5,包括小数和&amp;小数点后2位数] 但这有一个限制,如果值中的数字大于5,它将显示实际值。
例如:123456.7的值将显示为123456.70。
这[指定号码。小数点后的数字,如printf所述]我听说也可以用于scanf,我不确定&amp;我使用的编译器不支持该格式。验证编译器是否存在。
现在,当谈到从外部接口获取数据时,你在谈论序列化,我的意思是在netwrok上传输数据。 然后,据我所知,你的方法很好。 我们通常倾向于以char的形式阅读,以确保应用程序适用于任何格式的数据。