一.浮点计算中发生精度丢失 大概很多有编程经验的朋友都对这个问题不陌生了:无论你使用的是什么编程语言,在使用浮点型数据进行精确计算时,你都有可能遇到计算结果出错的情况.来看下面的例子. // 这是一个利用浮点型数据进行精确计算时结果出错的例子,使用Java编写,有所省略. double a = (1.2 - 0.4) / 0.1;System.out.println(a); 如果你认为这个程序的输出结果是“8”的话,那你就错了.实际上,程序的输出结果是“7.999999999999999”.好,…
Java中浮点型数据Float和Double进行精确计算的问题 来源  https://www.cnblogs.com/banxian/p/3781130.html 一.浮点计算中发生精度丢失       大概很多有编程经验的朋友都对这个问题不陌生了:无论你使用的是什么编程语言,在使用浮点型数据进行精确计算时,你都有可能遇到计算结果出错的情况.来看下面的例子. // 这是一个利用浮点型数据进行精确计算时结果出错的例子,使用Java编写,有所省略. double a = (1.2 - 0.4) /…
JavaScript 中的所有数据都是以 64 位浮点型数据(float) 来存储. 所有的编程语言,包括 JavaScript,对浮点型数据的精确度都很难确定: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>菜鸟教程(runoob.com)</title> </head> <body> <p id="…
首先引用一个例子在java中可能你会遇到这样的问题: 例:0.99999999f==1f //true 0.9999999f==1f //false 这是超出精度造成的,为了知道为什么会造成这样的问题,首先了解一下float和double的内存结构 1.内存结构 float和double的范围是由指数的位数来决定的.float的指数位有8位,而double的指数位有11位,分布如下: float:1bit(符号位) 8bits(指数位) 23bits(尾数位) double:1bit(符号位)…
#define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<string.h> #include<stdlib.h> #include<math.h> #include<time.h> int main() { /*实型变量也可以称为浮点型变量,浮点型变量是用来存储小数数值的,在c语言中,浮点型变量分为两种: 单精度浮点数(float).双精度浮点数(double).但是double型变量…
引用参考 https://www.cnblogs.com/chenmingjun/p/8415464.html#4291528 https://blog.csdn.net/yansmile1/article/details/70145416 java语言中,个字节(32位)来存储.double类型占用8个字节(64位). 从存储结构和算法上来讲,double和float是一样的,不一样的地方仅仅是float是32位的,double是64位的,所以double能存储更高的精度. 按照IEEE制定的…
解决方法1: 对Double类型的数字进行 格式化输出 ,相对来说不是很精确 import java.text.DecimalFormat;   public class TestDouble_String { public static void main(String[] args) {   Double double1 = 123456789.123456789; DecimalFormat decimalFormat = new DecimalFormat("#,##0.00"…
1.实际意义 在实际开发中,如果需要进行float或double的精确计算(尤其是财务计算),直接使用float或double是不行的(具体的例子看下边的代码的main方法的测试结果),需要使用BigDecimal. 2.代码 package com.xxx.util; import java.math.BigDecimal; /** * 浮点数精准算法 */ public class BigDecimalArithUtil { private static final int DIV_SCAL…
Big Decimal 在java中,对于float与double中的数据,总会因为精度问题而丢失数据的准确性,也就是说对于两者所处理的得到的值是无限接近于那个数,而并非一个精确数字,而对于电商中所涉及到的关于浮点型与double型数据,并且数据又得要求是准确性,又该如何处理呢?这里,必须用到Big Decimal! 一.先看代码: (一) @Test public void test1(){ System.out.print(0.05+0.01); System.out.print(1.0-0…
http://blog.csdn.net/androiddevelop/article/details/8478879 一  问题描述 float和double类型不能用于精确计算,其主要目的是为了科学计算和工程计算,它们执行二进制浮点原酸,目的是为了广泛的数值范围上提供较为精确的快速近似计算而精心设计的.但是如果设计钱币之类的计算需要很精确,所以这种情况不能使用float和double,因为要让其精确表示0.1 或者 10的任何负数次方值是不可能的. 二 眼见为实,举例证明: [java] v…
先标注一个音标,因为我老是读错:decimal ['desɪml] 精度对比: 类型 CTS 类型 描述 有效数字 范围 float System.Single 32-bit single-precision floating point 7 ±1.5 × 10−45 to ±3.4 × 1038 double System.Double 64-bit double-precision floating point 15/16 ±5.0 × 10 −324 to ±1.7 × 10308 dec…
精度 相比 float ,double 从其名字上已经展示出,它的精度是前者的两倍,他们的精度分别为: float: 7 位数字 double: 15 位数字 可通过如下的示例看出,在重复进行计算时,精度差异开始显现: float a = 1.f / 81; float b = 0; for (int i = 0; i < 729; ++ i) b += a; printf("%.7g\n", b); // prints 9.000023 double a = 1.0 / 81;…
 运算符间的优先级关系: 链栈结构体定义: 数据域使用字符串长度为20的字符数组(故需要注意判断读取的字符串是运算符还是数值) 可支持浮点型数据,负数, 整型数据的运算 float EvaluateExpression() 函数实现步骤: 1)初始化OPTR栈和OPND栈,将表达式起始符 “#” 压入OPTR栈. 2)扫描表达式,读入第一个字符串str,如果表达式没有扫描完毕至 "#" 或压入OPTR的栈顶元素不为 "#" 时,则循环执行以下操作: ——>使用…
让一个float或者double精确的表示0.1或者10的任何负数次方值都是不可能.float和double它们执行二进制浮点运算, 它们是为了在广泛的数值范围上提供较为精确的快速近似计算而精心设计的,所以它们并没哟提供完全精确的结果. 在涉及到精确计算时 使用BigDecimal  ,int ,long.…
小数精确计算 System.out.println(2.00 -1.10);//0.8999999999999999 上面的计算出的结果不是 0.9,而是一连串的小数.问题在于1.1这个数字不能被精确表示为一个double,因此它被表 示为最接近它的double值,该程序从2中减去的就是这个值,但这个计算的结果并不是最接近0.9的double值. 一般地说,问题在于并不是所有的小数都可以用二进制浮点数精确表示. 二进制浮点对于货币计算是非常不适合的,因为它不可能将1.0表示成10的其他任何负次幂…
(转)Java浮点数float,bigdecimal和double精确计算的精度误差问题总结 1.float整数计算误差 案例:会员积分字段采用float类型,导致计算会员积分时,7位整数的数据计算结果出现误差. 原因:超出float精度范围,无法精确计算. float和double的精度是由尾数的位数来决定的.浮点数在内存中是按科学计数法来存储的,其整数部分始终是一个隐含着的“1”,由于它是不变的,故不能对精度造成影响. float:2^23 = 8388608,一共七位,这意味着最多能有7位…
在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都要在计算机里转换进行二进制存储,这就涉及到数据精度,出现这个现象的原因正是浮点型数据的精度问题.先了解下…
在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能得到实际的数据? 解决办法…
注:转自 https://blog.csdn.net/bleach_kids/article/details/49129943 在使用Java,double 进行运算时,经常出现精度丢失的问题,总是在一个正确的结果左右偏0.0000**1. 特别在实际项目中,通过一个公式校验该值是否大于0,如果大于0我们会做一件事情,小于0我们又处理其他事情. 这样的情况通过double计算出来的结果去和0比较大小,尤其是有小数点的时候,经常会因为精度丢失而导致程序处理流程出错. BigDecimal在<Eff…
java中的float.double计算存在精度问题,这不仅仅在java会出现,在其他语言中也会存在,其原因是出在IEEE 754标准上. 而java对此提供了一个用于浮点型计算的类——BigDecimal(java.math.BigDecimal),通过将double替换成BigDecimal进行计算可以获得较为精确的计算结果. BigDecimal的构造方法有许多,在此推荐使用BigDecimal(String val)的构造方法,通过String字符串进行构造.可能会有人直接使用BigDe…
java的基本数据类型-浮点型:单精度(float)和双精度(double). float:单精度浮点数在机内占4个字节.有效数字8位.表示范围:-3.40E+38 ~ +3.40E+38; double:双精度浮点数在机内占8个字节.有效数字16位.表示范围:-1.79E+308 ~ +1.79E+308 浮点型计算速度快,但是精度低,float和double只能用来进行科学计算或工程计算,在大多数的商业计算中,一般采用java.math.BigDecimal类来进行精确计算,但是BigDec…
实型(浮点型):float.double 实型变量也可以称为浮点型,浮点型变量是用来存储小数数值的.在C语言中,浮点型分为两种:单精度浮点型(float).双精度浮点型(double),但是double型变量所表示的浮点数比float型变量更精确. 由于浮点型变量是由有限的存储单元组成,因此只能提供有限的有效数字.在有效位以外的数字将被舍去,这样可能会产生一些误差. 不以f结尾的常量是double类型,以f结尾的常量(如3.14f)是float类型. 代码示例: #include<stdio.h…
原文网址: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 所采用的浮点数据表示形式的副作用.为此,可能会经历一些精度丢失,并且一些浮点运算可能会产生意外的结果…
问题的提出:如果我们编译运行下面这个程序会看到什么? 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("BigDecimal:"+new BigDecimal(Double.toString(4.015)).multiply(new B…
近期在写C++ socket和java socket之间的通信程序,涉及到整数浮点数的传输.须要从字节数组还原数据,查了一些资料.总结例如以下 1.       整数和浮点数的机器表示 在机器内部.不论是一个整数还是浮点数.都是以一个二进制串的形式存储. 整数可能是原码.补码表示,浮点数有阶码尾数两部分构成.不管如何都是一个二进制串.可是这个二进制串如何表示不同的机器可能採取不同的方案. 关于浮点数: 一个机器上的32位浮点数的二进制串在还有一个机器把它作为32位浮点数解释时可能得到不同的值,这…
今天在公司讨论项目重构的问题时,公司的 DBA 针对表中的字段大概介绍了一下 float 和 double 的存储方式.然后,我发现这个问题又回到了浮点数类型在内存中的存储方式,即 IEEE 对浮点数存储的标准. 我在之前的内容中写到过,在公司另外一个项目当中,在写一个 TCP 服务器时,对端的设备中发来的数据就存在浮点数,当时 TCP 服务器使用的是 Java 的 Netty 写的,而对端的设备中的程序是用 C 语言写的,而数据中存在使用 IEEE 编码表示的浮点数,所以 Java 写的 Ne…
展开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语…
java中int,float,long,double取值范围是多少? 写道 public class TestOutOfBound { public static void main(String[] args) { System.out.println(Integer.MAX_VALUE-(-Integer.MAX_VALUE)); //内存溢出System.out.println(Integer.MAX_VALUE); //2的31次方-1,10个数位,正的20亿左右,用在钱上面不一定够Sy…
如果我们编译运行下面这个程序会看到什么? 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…