int 转 float 为什么有时会丢失精度
答案:3 悬赏:80
解决时间 2021-02-03 19:25
- 提问者网友:樱花树下最美的约定
- 2021-02-03 04:43
在java中
最佳答案
- 二级知识专家网友:一起来看看吧
- 2021-02-03 05:37
int是整型,用来表示整数,其值是精确值。
float是浮点型,用来表示实数,其值是近似值。
所以当int转换为float时,是由准确值变成了近似值,所以会丢失精度。
比如int 的1000,转换为浮点型时,可能会被存成1000.00000000001,用来计算或者输出时看不出区别,实际上是已经有变化了。
在32位和64位的编译器中,int和float都是占四字节。
int可以表示范围为-2147483648~2147483647。
float可以表示-3.40E+38 ~ +3.40E+38。
从这个角度上看,float可以表示的范围比int的大太多了,对于比较大的数值,自然就会差距越大。
比如下面的代码
int main()
{
int a = 2147483000;
float b = a;
printf("%f\n",b);
return 0;
}在gcc下输出
2147483008.000000
与原本值已经相差了8。
float是浮点型,用来表示实数,其值是近似值。
所以当int转换为float时,是由准确值变成了近似值,所以会丢失精度。
比如int 的1000,转换为浮点型时,可能会被存成1000.00000000001,用来计算或者输出时看不出区别,实际上是已经有变化了。
在32位和64位的编译器中,int和float都是占四字节。
int可以表示范围为-2147483648~2147483647。
float可以表示-3.40E+38 ~ +3.40E+38。
从这个角度上看,float可以表示的范围比int的大太多了,对于比较大的数值,自然就会差距越大。
比如下面的代码
int main()
{
int a = 2147483000;
float b = a;
printf("%f\n",b);
return 0;
}在gcc下输出
2147483008.000000
与原本值已经相差了8。
全部回答
- 1楼网友:苦柚恕我颓废
- 2021-02-03 08:24
比如说
原先的数值为 3.5
你转换成整型后为 3了
后面的小数位就没有了,当然会丢失精度了。
- 2楼网友:飘零作归宿
- 2021-02-03 06:45
float和double只是位数不一样,对浮点数的表示方式都是一样的。float会损失精确,doube必然也会损失精度。
补充:
java 的浮点类型都依据 ieee 754 标准。ieee 754 定义了32 位和 64 位双精度两种浮点二进制小数标准。
ieee 754 用科学记数法以底数为 2 的小数来表示浮点数。
对于32 位浮点数float用 第1 位表示数字的符号,用第2至9位来表示指数,用 最后23 位来表示尾数,即小数部分。
float(32位):
对于64 位双精度浮点数,用 第1 位表示数字的符号,用 11 位表示指数,52 位表示尾数。
double(64位):
都是分为三个部分:
(1) 一个单独的符号位s 直接编码符号s 。
(2)k 位的幂指数e ,移码表示 。
(3)n 位的小数,原码表示 。
当下面情况出现是则无法精确表示:
1.幂数不够表示了:这种情况往往出现在数字太大了,超过幂数所能承受的范围,那么这个数字就无法表示了。如幂数最大只能是10,但是这个数字用科学计数法表示时,幂数一定会超过10,就没办法了。
2.尾数不够表示了:这种情况往往出现在数字精度太长了,如1.3434343233332这样的数字,虽然很小,还不超过2,这种情况下幂数完全满足要求,但是尾数已经不能表示出来了这么长的精度。
我要举报
如以上问答内容为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯
• 手机登qq时,显示手机磁盘不足,清理后重新登 |
• 刺客的套装怎么选啊? |