#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
建议将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 还出现在数组的定义中,这样会出错。
将表达式中的 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不会有这个警告。
而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:
有什么书专门讲这个么?我想系统看看
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
建议将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 还出现在数组的定义中,这样会出错。
将表达式中的 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不会有这个警告。
而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:
有什么书专门讲这个么?我想系统看看
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,这属于语言设计时对一些细节考虑的思路不一样。