conversion from 'int' to 'float', possible loss of data这是什么意思?

时间:2021-09-19 16:11:05
#include <iostream.h>
#include <iomanip.h>
#define M 5
#define N 3
void main()
{
int i,j,sum=0,a[M][N];
float average,sv[N];
cout<<"input score\n";
for(i=0;i<N;i++)
{
for(j=0;j<M;j++)
{
cin>>a[j][i];
sum=sum+a[j][i];
}
sv[i]=sum/M;//这一行老是错误。
sum=0;
}
average=(sv[0]+sv[1]+sv[2]);
cout<<sv[0];
cout<<sv[1];
cout<<sv[2];
cout<<average;
}
第17行显示warning C4244: '=' : conversion from 'int' to 'float', possible loss of data

22 个解决方案

#1


警告c4244“=”:将"int"转换为“float”有可能损失数据精度。

建议将M的定义改为
#define M 5.0

#2


将int 型的转换为float型的可能会丢失数据.

#3


将除法转换为浮点数的除法

#4


类型转换的问题.

#5


将int 型转换为float型不会丢失数据,这是我们都知道的,所以这个提示文不对题。不过,它指出的地方确实存在着问题:sum 和 M 都是整型,sum/M 的结果也只能是整型,小数点后面的部分就被舍弃了,所以是这里存在着数据丢失。

将表达式中的 sum 和 M 转换为 float 型可解决这个问题。

>> 建议将M的定义改为
>> #define M 5.0

最好不要这么做,因为 M 还出现在数组的定义中,这样会出错。

#6


表示从int转换到float的时候,数值的精度有可能丢失。

#7


不可能啊!怎么可能出现精度丢失呢?你用的是什么编译器?

#8


可能丢失数据,在C语言的世界里,没有int long float 只有 char~(我的理解)

#9


int --> float 好像只有在 16 位机器上才不丢失精度吧, float 只有 23 位尾数, 在 32 位机器上不丢失精度才怪 ...

#10


在32位平台上,通常int是4字节长度,最多表示到21亿多,而int型是“绝对精确”的,换句话说,就是int行最多可以保证10位十进制有效数字的精确度。
而float只能保证6位有效数字的精确度,因此int到float的转换是可能丢失精度的,比如
整数“1234567899”转换成float后,大约是:1.23457936乘10的9次方,也就是从第7位有效数字开始已经不准确了。
double可以保证15位10进制有效数字的精度,所以从int到double不会有这个警告。

#11


在32位平台上,通常int和float都是4字节的,那既然字节数一样,凭什么int只能表示到21亿,而float可以表示到10的38次方?答案就是float跟int相比,牺牲了精确度,换来了更大的表示范围。

#12


看了steedhorse的分析,知道自己上面错了。受教了!

#13


(山清水秀)说得不错,没注意到这个问题了。

#14


数据类型从float 向 int 转换,可能会有数据的丢失.
这种警告多半是表达式中数据类型不一致引起..

#15


steedhorse分析的透彻,学习!

#16


那是不是将表达式中的 sum 和 M 转换为 float 型
就能解决我所提出的问题?

#17


但是楼主没有int到float的转换阿,是宏自动将m设置为float么?不回吧

steedhorse:
有什么书专门讲这个么?我想系统看看

#18


sum是int,M是int,sum/M还是int,而sv[i]是float,那么sv[i] = sum/M;不就是int到float的转换么?
这些都是基本知识,一般计算机组成原理教材中都应该提到啊。

#19


这是=左右的类型不一样,这样系统会隐式转换右边的为左边的类型。

#20


我认为是因为整数相除的结果是整数,转换为float型会使值发生变化

#21


同上!

#22


不过在Java里,float赋给int没有任何问题,也没有error,也没有warning,这属于语言设计时对一些细节考虑的思路不一样。

#1


警告c4244“=”:将"int"转换为“float”有可能损失数据精度。

建议将M的定义改为
#define M 5.0

#2


将int 型的转换为float型的可能会丢失数据.

#3


将除法转换为浮点数的除法

#4


类型转换的问题.

#5


将int 型转换为float型不会丢失数据,这是我们都知道的,所以这个提示文不对题。不过,它指出的地方确实存在着问题:sum 和 M 都是整型,sum/M 的结果也只能是整型,小数点后面的部分就被舍弃了,所以是这里存在着数据丢失。

将表达式中的 sum 和 M 转换为 float 型可解决这个问题。

>> 建议将M的定义改为
>> #define M 5.0

最好不要这么做,因为 M 还出现在数组的定义中,这样会出错。

#6


表示从int转换到float的时候,数值的精度有可能丢失。

#7


不可能啊!怎么可能出现精度丢失呢?你用的是什么编译器?

#8


可能丢失数据,在C语言的世界里,没有int long float 只有 char~(我的理解)

#9


int --> float 好像只有在 16 位机器上才不丢失精度吧, float 只有 23 位尾数, 在 32 位机器上不丢失精度才怪 ...

#10


在32位平台上,通常int是4字节长度,最多表示到21亿多,而int型是“绝对精确”的,换句话说,就是int行最多可以保证10位十进制有效数字的精确度。
而float只能保证6位有效数字的精确度,因此int到float的转换是可能丢失精度的,比如
整数“1234567899”转换成float后,大约是:1.23457936乘10的9次方,也就是从第7位有效数字开始已经不准确了。
double可以保证15位10进制有效数字的精度,所以从int到double不会有这个警告。

#11


在32位平台上,通常int和float都是4字节的,那既然字节数一样,凭什么int只能表示到21亿,而float可以表示到10的38次方?答案就是float跟int相比,牺牲了精确度,换来了更大的表示范围。

#12


看了steedhorse的分析,知道自己上面错了。受教了!

#13


(山清水秀)说得不错,没注意到这个问题了。

#14


数据类型从float 向 int 转换,可能会有数据的丢失.
这种警告多半是表达式中数据类型不一致引起..

#15


steedhorse分析的透彻,学习!

#16


那是不是将表达式中的 sum 和 M 转换为 float 型
就能解决我所提出的问题?

#17


但是楼主没有int到float的转换阿,是宏自动将m设置为float么?不回吧

steedhorse:
有什么书专门讲这个么?我想系统看看

#18


sum是int,M是int,sum/M还是int,而sv[i]是float,那么sv[i] = sum/M;不就是int到float的转换么?
这些都是基本知识,一般计算机组成原理教材中都应该提到啊。

#19


这是=左右的类型不一样,这样系统会隐式转换右边的为左边的类型。

#20


我认为是因为整数相除的结果是整数,转换为float型会使值发生变化

#21


同上!

#22


不过在Java里,float赋给int没有任何问题,也没有error,也没有warning,这属于语言设计时对一些细节考虑的思路不一样。