C / C ++中的固定长度浮点数?

时间:2009-07-15 05:17:33

标签: c++ c

我想知道是否可以限制我们在浮点数中输入的字符数。 我似乎无法找到任何方法。我必须从外部接口读取数据,该接口发送xx.xx形式的浮点数据。截至目前,我正在使用转换为char,反之亦然,这是一个混乱的解决方法。有人可以提出改进解决方案的建议吗?

9 个答案:

答案 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的形式阅读,以确保应用程序适用于任何格式的数据。