变量的变化值。

时间:2011-10-22 15:58:40

标签: c floating-point precision

我开始学习C编程,我遇到了这个代码的问题:

#include <stdio.h>

float jobPrice (int numberOfPages, float pricePerSheet, float pricePerPlate, int numberOfCopies)
{
    return (((pricePerPlate * numberOfPages) + ((numberOfPages/2)*numberOfCopies*pricePerSheet) + (numberOfCopies*2)) * 1.175f);
}


float colourPrinting (int numberOfPages, int numberOfCopies)
{
    return jobPrice(numberOfPages, 0.04f, 28.00f, numberOfCopies);
}

int main ()
{
    printf("%f\n", colourPrinting(32, 1000));
    return 0;
}

应打印的值为4154.8,但我的程序正在打印4154.799805。我调试了代码,似乎在使用pricePerSheet参数0.04f调用jobPrice时,它正在变为0.0399999991。

任何帮助都将不胜感激。

3 个答案:

答案 0 :(得分:2)

浮点数未完全表示,而是通过近似表示。

0.0399999991是您系统对0.04f

的表示

您可以在此here上阅读更多内容。

答案 1 :(得分:2)

使用double代替floatfloat提供最多7个有效十进制数字,并且您的打印格式正在尝试提取10,这会导致垃圾。或者只打印2位小数;这将给你6个重要数字的答案。

有关详细信息,请参阅'What Every Computer Scientist Should Know About Floating-Point Arithmetic'

答案 2 :(得分:1)

浮点运算不精确;不能保证,如果你从一个小数开始,你将保留一个小数,即使你只做了一些操作,如果你在纸上做了将产生相同的小数。如果你想保持一定数量的小数(特别是在使用金钱时),请使用整数并在需要时转换为十进制(如果你正在使用美元,你可以将其视为美分)。