浮动的值与扫描的值不同

时间:2016-04-09 20:38:21

标签: c

所以我有这个程序,我需要比较0.0X范围内的值,如果我用这个小东西扫描例如50.21

scanf("%f",bill);

存储在var中的值账单实际上是50.2099990845 ...这会在计划中稍后计算。有没有办法把这个数字变成50.210000?谢谢你的时间。

2 个答案:

答案 0 :(得分:0)

不要使用IEEE-754浮点数(singlefloatdouble)进行十进制计算,其中所有数字都同等重要(就业务规则而言)关心)。这是因为IEEE-754具有舍入误差,并且不能准确地表示一些微不足道的十进制数。它真正适用于可接受少量信息丢失的科学和工程应用。

如果您处理固定精度十进制数(例如货币值),最好的方法是使用预乘的整数,因此100(100美分)代表1美元。

如果您要使用scanf,我建议您:

int dollars = 0, cents = 0;
bool done = false;
while( !done ) {
    done = scanf("%4d.%2d", &dollars, &cents) != 2
}

cents += dollars * 100;

请注意我使用最大长度说明符(分别为42)以防止scanf中的缓冲区溢出。

答案 1 :(得分:0)

C中的浮点数(以及大多数其他语言)存储为IEEE-754表示形式。您可以将这些视为科学记数法中基数的两个近似值。

在你的情况下,50.21不能完全用二进制表示,因为.21不是2的倍数,因此软件最好通过舍入到50.2099990845。

对于财务应用程序,您最好存储一个以美分为单位的整数,而不是美元(或等价物)。这样,你就不会在整个过程中遇到任何舍入错误!