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

Posted

技术标签:

【中文标题】为啥我会从“double”转换为“float”,可能会丢失数据警告?(c)【英文标题】:Why do I get a conversion from 'double' to 'float', possible loss of data warning?(c)为什么我会从“double”转换为“float”,可能会丢失数据警告?(c) 【发布时间】:2014-12-13 17:03:56 【问题描述】:

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

//进口汽车的总关税//

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\visual studio 2013\projects\total costs\total costs\tot.c(9): 警告 C4244: '=' : 从 'double' 转换为 'float',可能丢失数据

1>c:\users\david\documents\visual studio 2013\projects\total costs\total costs\tot.c(10): 警告 C4244: '=' : 从 'double' 转换为 'float',可能丢失数据

1>c:\users\david\documents\visual studio 2013\projects\total costs\total costs\tot.c(11): 警告 C4244: '=' : 从 'double' 转换为 'float',可能丢失数据

【问题讨论】:

[sigh].. 哪一行产生了警告。 var 声明和类型在哪里? 请显示变量定义。 第 (9) 行生成警告。 变量定义是什么意思。我已经定义了我的变量。都是浮动的 没有收到警告,第 9 行是哪一行? 【参考方案1】:

在几行中,您乘以 0.010.25 等常量值。这些值是双精度值,乘法的结果是双精度值,然后将其存储在精度较低的浮点变量中。这会给你一个编译器警告。要修复它,您可以将 f 文字后缀附加到常量值,例如0.01f0.25f 等。

【讨论】:

在我的代码中我附上了它。看一看。我仍然收到警告 @DavidAsmah:不,您显然在第 9 行使用了文字 0.01,这是一个双重文字。用浮点文字 0.01f 替换它,警告就会消失。我刚刚自己测试过。 但是当我测试它时我得到一个负值,这是错误的 为什么警告说“可能数据丢失”,当然它应该知道 0.01 是否可以表示为浮点数? @riv 当double 存储在float 变量中时,可能会丢失数据。这发生在运行时,编译器会发出警告。编译器无法在编译时知道转换是否会丢失精度。损失是可能的,因为它不会一直发生。 1d 转换为 1f 仍然只有 1。但是,0.1 没有使用二进制浮点数的精确表示,0.1d0.1f 的数字并不完全相同。在我的电脑上0.1f - 0.1d 是 1.49011611383365×10⁻⁹。【参考方案2】:

因为sizeof(double) > sizeof(float),因此您会失去精度。

【讨论】:

以上是关于为啥我会从“double”转换为“float”,可能会丢失数据警告?(c)的主要内容,如果未能解决你的问题,请参考以下文章

为啥java语句double数据后可以加L如 double d=33L float f=33L

错误83错误C2398:从'double'转换为'float'需要缩小转换

从 float 转换为 double 会产生不同的结果——相同的代码、相同的编译器、相同的操作系统

Go:为啥从 float64 转换为 float32 并返回会导致值发生变化? [复制]

在java中的double和float类型数据相除为啥可以除以零

为啥我会收到 ValueError: could not convert string to float in Python? [复制]