为什么要从';双倍';至';浮动';,可能丢失数据警告?(c)

为什么要从';双倍';至';浮动';,可能丢失数据警告?(c),c,visual-studio,C,Visual Studio,我正在写一个程序,基本上计算进口汽车的关税。用户应该输入这些值——汽车和货物的价格值。但是当我计算时,我得到了这个错误,这是不好的 //进口汽车应缴纳的总关税// main() { float purchaseprice, shipmentcosts, ecowaslevy, importlevy, GCNETlevy, TotalDuty; printf("Enter the purchase price and shipment cost");

我正在写一个程序,基本上计算进口汽车的关税。用户应该输入这些值——汽车和货物的价格值。但是当我计算时,我得到了这个错误,这是不好的

//进口汽车应缴纳的总关税//

main()
{

        float purchaseprice, shipmentcosts, ecowaslevy, importlevy, GCNETlevy, TotalDuty;

        printf("Enter the purchase price and shipment cost");


        scanf("%f,%f", &purchaseprice, &shipmentcosts);
        ecowaslevy = 0.01f, importlevy = 0.25f, GCNETlevy = 0.05f;
        //FORMULAS FOR THE LEVY//
        ecowaslevy = (purchaseprice + shipmentcosts) * (0.01); 
        importlevy = (purchaseprice + shipmentcosts) * (0.25); 
        GCNETlevy =  (purchaseprice + shipmentcosts) * (0.05); 
        //FORMULA FOR TOTAL DUTY//
        TotalDuty = (ecowaslevy + importlevy + GCNETlevy)*(3.2);
        printf("TOTAL DUTY=GHC.%f", TotalDuty);
        system("pause");

}
以下是警告:

1> c:\users\david\documents\visualstudio 2013\projects\total expenses\tot.c(9):警告C4244:“=”:从“double”转换为“float”,可能会丢失数据

1> c:\users\david\documents\visualstudio 2013\projects\total expenses\tot.c(10):警告C4244:“=”:从“double”转换为“float”,可能会丢失数据


1> c:\users\david\documents\visualstudio 2013\projects\total expenses\tot.c(11):警告C4244:“=”:从“double”转换为“float”,可能会丢失数据,因为
sizeof(double)>sizeof(float)
因此失去了精度。

在几行中,您将乘以常量值,如
0.01
0.25
。这些值是双倍的,乘法的结果是双倍的,然后存储在精度较低的浮点变量中。这会给您一个编译器警告。要解决此问题,您可以将
f
文字后缀附加到常量值,例如
0.01f
0.25f
等。

[叹气]。。哪一行生成警告。变量声明和类型在哪里?请显示变量定义。第(9)行生成警告。变量定义是什么意思。我已经定义了我的变量。都是浮动的,没有得到警告,哪一行是第9行?在我的代码中,我附加了它。看看。我仍然得到了那份工作warning@DavidAsmah:否,您显然在第9行中使用了双字面值
0.01
。将其替换为浮动文字
0.01f
,警告消失。我只是自己测试了一下。但是当我测试它时,我得到了一个负值,这是错误的。为什么警告说“可能会丢失数据”呢?当然,它应该知道0.01是否可以表示为浮点值?@riv可能的数据丢失是当
double
存储在
float
变量中时。这种情况发生在运行时,编译器将发出有关此情况的警告。编译器在编译时无法知道转换是否丢失精度。这种损失是可能的,因为它并非总是发生
1d
转换为
1f
,该值仍然只有1。但是,0.1没有使用二进制浮点数的精确表示,并且
0.1d
0.1f
的数字并不完全相同。在我的计算机上
0.1f-0.1d
是1.490111383365×10⁻⁹.