所以我有这个程序,我需要比较0.0X范围内的值,如果我用这个小东西扫描例如50.21
scanf("%f",bill);
存储在var中的值账单实际上是50.2099990845 ...这会在计划中稍后计算。有没有办法把这个数字变成50.210000?谢谢你的时间。
答案 0 :(得分:0)
不要使用IEEE-754浮点数(single
,float
,double
)进行十进制计算,其中所有数字都同等重要(就业务规则而言)关心)。这是因为IEEE-754具有舍入误差,并且不能准确地表示一些微不足道的十进制数。它真正适用于可接受少量信息丢失的科学和工程应用。
如果您处理固定精度十进制数(例如货币值),最好的方法是使用预乘的整数,因此100
(100美分)代表1
美元。
如果您要使用scanf
,我建议您:
int dollars = 0, cents = 0;
bool done = false;
while( !done ) {
done = scanf("%4d.%2d", &dollars, ¢s) != 2
}
cents += dollars * 100;
请注意我使用最大长度说明符(分别为4
和2
)以防止scanf
中的缓冲区溢出。
答案 1 :(得分:0)
C中的浮点数(以及大多数其他语言)存储为IEEE-754表示形式。您可以将这些视为科学记数法中基数的两个近似值。
在你的情况下,50.21不能完全用二进制表示,因为.21不是2的倍数,因此软件最好通过舍入到50.2099990845。
对于财务应用程序,您最好存储一个以美分为单位的整数,而不是美元(或等价物)。这样,你就不会在整个过程中遇到任何舍入错误!