float和double型,的底层实现是二进制的。十进制中的一个有限位数小数,转换成二进制就不一定是有限位数了,一旦位数超过的float和double型的位数宽度,就会出现“精度溢出”。所以float和double型是为了科学计算而设计的,并不适合精确的十进制计算,尤其不适合用来表示货币。
我以前也曾出货类似于为什么 2.0f - 1.9f 的结果不是 0.1f 之类的面试题。原因前面已经说了,其实不管什么语言,只要是标准的单精度浮点和双精度浮点类型的实现,就都存在此问题。VB.Net、C#甚至AS3中的Number型(从精度上看应该是Double)也都如此。
好在Java给我们准备了BigDecimal(C#中也可以通过引用java.math使用J#的BigDecimal)。但是BigDecimal是一个非常标准的类,因而对它的加减乘除等运算以及比较大小使用起来要比原生的数值类型要麻烦一些。(Java也不支持操作符重载)
再有一点,就是在跨语言协作时,序列化/反序列化时,其他语言往往没有相应的类型与Java的BigDecimal对应。(AS3就只能用String与之对应)
【Effective Java 学习笔记】系列连载专题请见:
http://tonylian.iteye.com/categories/64208
分享到:
相关推荐
float和double为什么不可以使用精度计算的解析。
数据精度问题 float与double的范围和精度
本篇文章是对C++中浮点数(float、double)类型数据比较与转换进行了详细的分析介绍,需要的朋友参考下
将32bit的float型数据 转换为 64bit的double类型存储在内存中,跨平台可用。解决C51等平台double类型为32bit存储的问题。
int float double string char * C->Java Java->C 实例
MySQL中存在float,double等非标准数据类型,也有decimal这种标准数据类型。 其区别在于,float,double等非标准类型,在DB中保存的是近似值,而Decimal则以字符串的形式保存数值。 float,double类型是可以存浮点数...
Convertor按照IEEE 754标准对Float和Double类型进行转换
十进制和十六进制转换成float、double数据,注意十六进制使用的时候需要鼠标右击才能粘贴,ctrl+v不行,十进制可以
16进制转成float 或double类型数据的一个小工具。
float double精度的详细解释,小数点位数等等
16位转浮点型float,MODBUS 32位转浮点型float 64位转双浮点型double
博客源代码:https://blog.csdn.net/u014411348/article/details/103776963
NULL 博文链接:https://thinktothings.iteye.com/blog/801301
iOS 解决字符串floatValue,doubleValue等后计算不精确问题,一句话解决精确计算,精确比较
解析参见:https://handsome-man.blog.csdn.net/article/details/107333529
float、double类型转换16进制工具
C语言和C#语言中,对于浮点类型的数据采用单精度类型(float)和双精度类型(double)来存储,float数据占用32bit, double数据占用64bit
结合图释详细介绍浮点数的计算机存储结构。解释了IEEE有关浮点数的标准。
主要介绍了JAVA中float与double的区别,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧