float精度java
‘壹’ java float double精度为什么会丢失
floata=3.14;这个语句的意思是把双精度浮点类型(double)赋值给单精度浮点类型(float)的变量a,把一个高精度的数赋值给一个低精度的数,就会照成精度丢失了。因为Java中,3.14这样的写法默认是认为double类型的,而3.14f这样的写法就会指定3.14这个数为float类型,这样赋值就不会有精度丢失了。注意,这里你不要单纯的把float想象成只能存一位小数点的数,3.14这个数同样用float可以存下
‘贰’ java float的精度 小菜鸟别喷啊
应该写成 float f = 3.4f
小数不在后面加f,默认是double类型
‘叁’ Java中 int和float哪个精度高
int是整型,float是小数类型的,如果谈精度的话肯定是float啦,因为如果一个小数类型的到int中也把小数点后的自动去掉了
‘肆’ java中float类型造成的精度误差如何解决
float 类型 精度只有7位有效数字 double 类型 精度12-14位有效数字 s=k/j; 会引进有效数字的截断误差。 double 型,输出格式用 %lf (Long Float -- lf)
‘伍’ java float double精度为什么会丢失
这个是二进制存储小数的问题,很多编程语言都存在这个问题。
二进制只能精确表示2的-n次方的整数倍小数
要精确地进行计算,请使用BigDecimal,并在计算时约束好小数位(比如精确到2位小数)。
‘陆’ java float 精度问题
你取这条数据的时候以字符串的形式拿出来就可以了,用比如说用jdbc,rs.getString()
‘柒’ java中如何实现将float精确到小数点后两位
方法1:用Math.round计算,这里返回的数字格式的.
float price=89.89;
int itemNum=3;
float totalPrice=price*itemNum;
float num=(float)(Math.round(totalPrice*100)/100);//如果要求精确4位就*10000然后/10000
方法2:用DecimalFormat 返回的是String格式的.该类对十进制进行全面的封装.像%号,千分位,小数精度.科学计算.
float price=1.2;
DecimalFormat decimalFormat=new DecimalFormat(".00");//构造方法的字符格式这里如果小数不足2位,会以0补足.
String p=decimalFomat.format(price);//format 返回的是字符串
‘捌’ java float double精度为什么会丢失
由于对float或double的使用不当,可能会出现精度丢失的问题。问题大概情况可以通过如下代码理解:
publicclassFloatDoubleTest{
publicstaticvoidmain(String[]args){
floatf=20014999;
doubled=f;
doubled2=20014999;
System.out.println("f="+f);
System.out.println("d="+d);
System.out.println("d2="+d2);
}
}
得到的结果如下:
f=2.0015E7
d=2.0015E7
d2=2.0014999E7
从输出结果可以看出double可以正确的表示20014999,而float没有办法表示20014999,得到的只是一个近似值。这样的结果很让人讶异。20014999这么小的数字在float下没办法表示。于是带着这个问题,做了一次关于float和double学习,做个简单分享,希望有助于大家对java浮点数的理解。
关于java的float和double
Java语言支持两种基本的浮点类型:float和double。java的浮点类型都依据IEEE754标准。IEEE754定义了32位和64位双精度两种浮点二进制小数标准。
IEEE754用科学记数法以底数为2的小数来表示浮点数。32位浮点数用1位表示数字的符号,用8位来表示指数,用23位来表示尾数,即小数部分。作为有符号整数的指数可以有正负之分。小数部分用二进制(底数2)小数来表示。对于64位双精度浮点数,用1位表示数字的符号,用11位表示指数,52位表示尾数。如下两个图来表示:
float(32位):
绿色部分是符号位,红色部分是幂指数,蓝色部分是尾数。
对比可以得出:符号位都是0,幂指数为移码表示,两者刚好也相等。唯一不同的是尾数。
在double的尾数为:,省略后面的零,至少需要24位才能正确表示。
而在float下面尾数为:00110001011001111001100,共23位。
为什么会这样?原因很明显,因为float尾数最多只能表示23位,所以24位的001100010110011110010111在float下面经过四舍五入变成了23位的00110001011001111001100。所以20014999在float下面变成了20015000。
也就是说20014999虽然是在float的表示范围之内,但在IEEE754的float表示法精度长度没有办法表示出20014999,而只能通过四舍五入得到一个近似值。
总结:
浮点运算很少是精确的,只要是超过精度能表示的范围就会产生误差。往往产生误差不是因为数的大小,而是因为数的精度。因此,产生的结果接近但不等于想要的结果。尤其在使用float和double作精确运算的时候要特别小心。
可以考虑采用一些替代方案来实现。如通过String结合BigDecimal或者通过使用long类型来转换。
‘玖’ JAVA中的float单精度,double双精度是什么意思呀不懂~~,还有什么怎么用这两个最好举下例子,谢谢
最简单例子:
float A = 1;
float B = 2;
double C = A * B;
这时如果用float C = A * B 就会报无法将double隐式转换成double类型
说明double的精度要高于float
所谓单精度双精度是根据类型对象所占用内存空间的字节数决定的,双精度所占内存空间为16位,而float只有8位
‘拾’ java中float和double的区别
单精度和双精度。
float是单精度类型,精度是8位有效数字,取值范围是10的-38次方到10的38次方,float占用4个字节的存储空间
double是双精度类型,精度是17位有效数字,取值范围是10的-308次方到10的308次方,double占用8个字节的存储空间
当你不声明的时候,默认小数都用double来表示,所以如果要用float的话,则应该在其后加上f
例如:float a=1.3;
则会提示不能将double转化成float 这成为窄型转化
如果要用float来修饰的话,则应该使用float a=1.3f
注意float是8位有效数字,第7位数字将会产生四舍五入
所以如果一个float变量 这样定义: float a=1.32344435; 则第7位将产生四舍五入(5及5以下的都将舍去)