精确计算java中float和double的精度】的更多相关文章

[本文相关的代码放在github上.地址为:https://github.com/VigourJiang/StructuredFloat] Java中double类型的格式基本遵循IEEE 754标准. 虽然数学意义上的小数是连续的.但double只能表示当中的一些离散点.把这些离散点组成的集合记为S.S的大小还是有限的.假设要保存的小数P刚好在集合S内,那么double类型就能精确的表示P:否则double类型只能从集合S中找一个与P近期的离散点P'取代P. 以上表述对于float也成立.IE…
在java中运行一下代码 System.out.println(2.00-1.10);输出的结果是:0.8999999999999999很奇怪,并不是我们想要的值0.9 再运行如下代码:System.out.println(2.00f-1.10f);输出结果:0.9 又正确了,为什么会导致这种问题?程序中为什么要尽量避免浮点数比较? 在java中浮点型默认是double的,及2.00和1.10都要在计算机里转换进行二进制存储,这就涉及到数据精度,出现这个现象的原因正是浮点型数据的精度问题.先了解…
为什么double转float不会出现数据误差,而float转double却误差如此之大?   double d = 3.14; float f = (float)d; System.out.println(f); 输出结果是:3.14; float f = 127.1f; double d = f; System.out.println(d); 输出结果是:127.0999984741211 为什么结果会是这样呢? 如何避免这样的问题发生,让float转double能得到实际的数据? 解决办法…
展开1. 添加尾缀说明 我们知道Java在变量赋值的时候,其中float.double.long数据类型变量,需要在赋值直接量后面分别添加f或F.d或D.l或L尾缀来说明.  其中,long类型最好以大写L来添加尾缀,因为小写l容易和数字1混淆.  例如: long lNum = 1234L; float fNum = 1.23f; double dNum = 1.23d; 这是Java语法规定,不添加尾缀很容易引起编译器报错,并且程序可读性也会变差.2. 不添加尾缀也不会报错的情况 Java语…
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…
float表示单精度浮点数在机内占4个字节,用32位二进制描述. double表示双精度浮点数在机内占8个字节,用64位二进制描述.浮点数在机内用指数型式表示,分解为:数符,尾数,指数符,指数四部分. 数符占1位二进制,表示数的正负. 指数符占1位二进制,表示指数的正负. 尾数表示浮点数有效数字,0.xxxxxxx,但不存开头的0和点 指数存指数的有效数字. 指数占多少位,尾数占多少位,由计算机系统决定. 可能是数符加尾数占24位,指数符加指数占8位 -- float. 数符加尾数占48位,指数…
原文网址:http://blog.sina.com.cn/s/blog_827d041701017ctm.html 问题提出:12.0f-11.9f=0.10000038,"减不尽"为什么? 来自MSDN的解释: http://msdn.microsoft.com/zh-cn/c151dt3s.aspx 为何浮点数可能丢失精度浮点十进制值通常没有完全相同的二进制表示形式. 这是 CPU 所采用的浮点数据表示形式的副作用.为此,可能会经历一些精度丢失,并且一些浮点运算可能会产生意外的结果…
Java浮点数 浮点数结构 要说清楚Java浮点数的取值范围与其精度,必须先了解浮点数的表示方法,浮点数的结构组成,之所以会有这种所谓的结构,是因为机器只认识01,你想表示小数,你要机器认识小数点这个东西,必须采用某种方法,比如,简单点的,float四个字节,前两个字节表示整数位,后两个字节表示小数位(这就是一种规则标准),这样就组成一个浮点数.而Java中浮点数采用的是IEEE 754标准. IEEE 754 这里就不细说什么是IEEE 754了,就直接讲具体内容,有兴趣的可以自己百度. fl…
在C#语言中,float.double以及decimal类型都可以用来表示小数,但三者还是有一定的不同,有效数字为相比的话,decimal类型的有效数字最大,float类型最小.计算浮点类型的运算,如果只有float和double类型选择的话,建议选择double类型,计算误差相对小一些.如果是涉及到财务或者货币金额等金融计算,建议使用十进制decimal类型,decimal的有效位数很大,达到了28位,可以保证计算结果更为精准. 针对这3种类型,其中float和double为基础类型,而dec…
Java中long和double的原子性 java中基本类型中,long和double的长度都是8个字节,32位(4字节)处理器对其读写操作无法一次完成,那么,JVM,long和double是原子性的吗? JVM中对long的操作是不是原子操作? 首先,通过一段程序对long的原子性进行判断.测试程序如下: public class LongAtomTest implements Runnable { private static long field = 0; private volatile…