float和double型,的底层实现是二进制的。十进制中的一个有限位数小数,转换成二进制就不一定是有限位数了,一旦位数超过的float和double型的位数宽度,就会出现“精度溢出”。所以float和double型是为了科学计算而设计的,并不适合精确的十进制计算.
就像一个十进制的小数,要不断地乘以2取整,但在这个过程中可能会一直循环下去,这就造成了数据的不精确。
所以在必须要求数据的精确度时,不能使用float和double.
public class Test{
public static void main(String[] args)
{
System.out.println(0.05+0.01);
System.out.println(1.0-0.42);
System.out.println(4.015*100);
System.out.println(123.3/100);
}
}
输出结果为:
0.060000000000000005
0.5800000000000001
401.49999999999994
1.2329999999999999
BigDecimal类可解决计算精度问题可使用BigDecimal类创建一个封装类。封装加减乘除操作
例:对一个小数进行指定位数的四舍五入:
BigDecimal bd = new BigDecimal("0.9851095");
BigDecimal one = new BigDecimal("1");
System.out.println(bd.divide(one, 3, BigDecimal.ROUND_HALF_UP));
BigDecimal中还有很多相关的数值之间的计算方法,以及精确到的位数和四舍五入等
分享到:
相关推荐
数据精度问题 float与double的范围和精度
float double精度的详细解释,小数点位数等等
使用Java,double 进行运算时,经常出现精度丢失的问题,总是在一个正确的结果左右偏0.0000**1。 特别在实际项目中,通过一个公式校验该值是否大于0,如果大于0我们会做一件事情,小于0我们又处理其他事情。 这样的...
float和double为什么不可以使用精度计算的解析。
STM32Flash闪存存储参考,支持多种类型操作(double,float等),已封装,便于移植
iOS 解决字符串floatValue,doubleValue等后计算不精确问题,一句话解决精确计算,精确比较
C语言和C#语言中,对于浮点类型的数据采用单精度类型(float)和双精度类型(double)来存储,float数据占用32bit, double数据占用64bit
浮点数在内存中的存储机制和整型数...1、将字符串转换为float、double过程存在精度损失,只是float、double各自损失的精度不相同而已std::string str=”8.2″;float cc=atof(str.c_str()); //cc的值为8.1999998std:
将32bit的float型数据 转换为 64bit的double类型存储在内存中,跨平台可用。解决C51等平台double类型为32bit存储的问题。
MySQL中存在float,double等非标准数据类型,也有decimal这种标准数据类型。 其区别在于,float,double等非标准类型,在DB中保存的是近似值,而Decimal则以字符串的形式保存数值。 float,double类型是可以存浮点数...
//将double类型转为_int64,防止精度1丢失 //将double类型转为_int64,防止精度1丢失
结合图释详细介绍浮点数的计算机存储结构。解释了IEEE有关浮点数的标准。
本篇文章主要介绍了iOS之关于double/float数据计算精度问题,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
double与8位16进制互转;float与4位16进制互转。处理发送的消息,或者收到的消息很方便。
Convertor按照IEEE 754标准对Float和Double类型进行转换
下面小编就为大家带来一篇解决java数值范围以及float与double精度丢失的问题。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
[iOS][Swift][中文]_基礎語法#06._小數、整數Int與雙精度浮點數Double,_Float
16进制转成float 或double类型数据的一个小工具。
16位转浮点型float,MODBUS 32位转浮点型float 64位转双浮点型double