为啥我会从“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.01
和 0.25
等常量值。这些值是双精度值,乘法的结果是双精度值,然后将其存储在精度较低的浮点变量中。这会给你一个编译器警告。要修复它,您可以将 f
文字后缀附加到常量值,例如0.01f
和 0.25f
等。
【讨论】:
在我的代码中我附上了它。看一看。我仍然收到警告 @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.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? [复制]