java中可能损失精度是什么意思
publicclassVariable{publicstaticvoidmain(String[]args){floatf=10.0f;doubled=100.0d;f=...
public class Variable {
public static void main(String[] args) {
float f=10.0f;
double d=100.0d;
f=d;
System.out.println("f="+f);
}
}
运行以后说是可能损失精度,是什么意思 展开
public static void main(String[] args) {
float f=10.0f;
double d=100.0d;
f=d;
System.out.println("f="+f);
}
}
运行以后说是可能损失精度,是什么意思 展开
5个回答
展开全部
public static void main(String[] args) {
//double类型转为float需要强转
/**
* float的指数位有8位,而double的指数位有11位
* float的指数范围为-127~+128,而double的指数范围为-1023~+1024
* float:2^23 = 8388608,一共七位,这意味着最多能有7位有效数字,但绝对能保证的为6位,也即float的精度为6~7位有效数字;
* double:2^52 = 4503599627370496,一共16位,同理,double的精度为15~16位。
*/
float f = 10.0f;
double d = 100.0d;
f = (float) d; //double转float,但是这样会造成损失精度
System.out.println("f=" + f);
}
展开全部
float与double的区别
单精度浮点数在机内占4个字节,用32位二进制描述。
双精度浮点数在机内占8个字节,用64位二进制描述。
浮点数在机内用指数型式表示,分解为:数符,尾数,指数符,指数四部分。
数符占1位二进制,表示数的正负。
指数符占1位二进制,表示指数的正负。
尾数表示浮点数有效数字,0.xxxxxxx,但不存开头的0和点
指数存指数的有效数字。
指数占多少位,尾数占多少位,由计算机系统决定。
可能是数符加尾数占24位,指数符加指数占8位 -- float.
数符加尾数占48位,指数符加指数占16位 -- double.
知道了这四部分的占位,按二进制估计大小范围,再换算为十进制,就是你想知道的数值范围。
对编程人员来说,double 和 float 的区别是double精度高,有效数字16位,float精度7位。但double消耗内存是float的两倍,double的运算速度比float慢得多,java语言中数学函数名称double 和 float不同,不要写错,能用单精度时不要用双精度(以省内存,加快运算速度)
所以你把double赋值给float变量的过程,实际上是一个强制转换,肯定会损失精度。
单精度浮点数在机内占4个字节,用32位二进制描述。
双精度浮点数在机内占8个字节,用64位二进制描述。
浮点数在机内用指数型式表示,分解为:数符,尾数,指数符,指数四部分。
数符占1位二进制,表示数的正负。
指数符占1位二进制,表示指数的正负。
尾数表示浮点数有效数字,0.xxxxxxx,但不存开头的0和点
指数存指数的有效数字。
指数占多少位,尾数占多少位,由计算机系统决定。
可能是数符加尾数占24位,指数符加指数占8位 -- float.
数符加尾数占48位,指数符加指数占16位 -- double.
知道了这四部分的占位,按二进制估计大小范围,再换算为十进制,就是你想知道的数值范围。
对编程人员来说,double 和 float 的区别是double精度高,有效数字16位,float精度7位。但double消耗内存是float的两倍,double的运算速度比float慢得多,java语言中数学函数名称double 和 float不同,不要写错,能用单精度时不要用双精度(以省内存,加快运算速度)
所以你把double赋值给float变量的过程,实际上是一个强制转换,肯定会损失精度。
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
double的存储范围比float大,f=d;如果d超过float存储范围,强制转换成float会损失精度
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
java中整数相乘或者相加,如果超出范围了,都会损失精度。
十进制数的二进制表示可能不够精确浮点数或是双精度浮点数无法精确表示的情况并不少见。浮点数值没办法用十进制来精确表示的原因要归咎于CPU表示浮点数的方法。这样的话您就可能会牺牲一些精度,有些浮点数运算也会引入误差。以上面提到的情况为例,8.1的二进制表示并非就是精确的8.1。反而最为接近的二进制表示是 0.8099999999999999。原因在于浮点数由两部分组成:指数和尾数。浮点数的值实际上是由一个特定的数学公式计算得到的。您所遇到的精度损失会在任何操作系统和编程环境中遇到。 注意: 您可以使用Binary Coded Decimal (BCD)库来保持精度。BCD数字编码方法会把每一个十进制数字位单独编码。 类型失配 您可能混合了浮点数和双精度浮点数类型。
十进制数的二进制表示可能不够精确浮点数或是双精度浮点数无法精确表示的情况并不少见。浮点数值没办法用十进制来精确表示的原因要归咎于CPU表示浮点数的方法。这样的话您就可能会牺牲一些精度,有些浮点数运算也会引入误差。以上面提到的情况为例,8.1的二进制表示并非就是精确的8.1。反而最为接近的二进制表示是 0.8099999999999999。原因在于浮点数由两部分组成:指数和尾数。浮点数的值实际上是由一个特定的数学公式计算得到的。您所遇到的精度损失会在任何操作系统和编程环境中遇到。 注意: 您可以使用Binary Coded Decimal (BCD)库来保持精度。BCD数字编码方法会把每一个十进制数字位单独编码。 类型失配 您可能混合了浮点数和双精度浮点数类型。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
一个十进制小数,哪怕是很简单的小数,如0.1,当你用二进制
来表示时,它却是个无限环小数。
十进制(0.1)=二进制(0.0001100110011....)
计算机是用二进制表示数的,存储的位长有限,只能截掉,
所以误差就产生了。
所以在一些要求四舍五入严格精度的场合,最好把浮点数转换为
整数来计算,否则可能在某些特殊的情况下产生意外的计算错误。
来表示时,它却是个无限环小数。
十进制(0.1)=二进制(0.0001100110011....)
计算机是用二进制表示数的,存储的位长有限,只能截掉,
所以误差就产生了。
所以在一些要求四舍五入严格精度的场合,最好把浮点数转换为
整数来计算,否则可能在某些特殊的情况下产生意外的计算错误。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询