Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/visual-studio/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么要从“double”转换为“float”,可能会丢失数据警告?(c)_C_Visual Studio - Fatal编程技术网

为什么要从“double”转换为“float”,可能会丢失数据警告?(c)

为什么要从“double”转换为“float”,可能会丢失数据警告?(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.c9:警告C4244:“=”:从“double”转换为“float”,可能会丢失数据

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


1> c:\users\david\documents\visualstudio 2013\projects\total expenses\tot.c11:警告C4244:“=”:从“double”到“float”的转换,可能会丢失数据,因为sizeofdouble>SizeOfLoat会导致精度降低。

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

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