单精度浮点数(float)加法计算出错

场景:

  一个float型的变量赋值1170601,加上19000000,结果出现错误。

原因:

  float占用4个字节(32位)存储空间,包括符号位1位,阶码位8位,尾数23位。浮点数精度与它的尾数有关。

  尾数为二进制小数1.m,m为23位的小数。所以浮点数的精度为24位二进制有效位数。2的24次方为16777216。

  19000000 > 16777216,做加法计算之后丢失精度出错。

解决方法:

  将float用double替换,double占用8个字节(64位)存储空间,包括符号位1位,阶码位11位,尾数52位。

  

时间: 2024-10-02 22:49:00

单精度浮点数(float)加法计算出错的相关文章

Java浮点数float和double精确计算的精度误差问题总结

1.float整数计算误差 案例:会员积分字段采用float类型,导致计算会员积分时,7位整数的数据计算结果出现误差. 原因:超出float精度范围,无法精确计算. float和double的精度是由尾数的位数来决定的.浮点数在内存中是按科学计数法来存储的,其整数部分始终是一个隐含着的“1”,由于它是不变的,故不能对精度造成影响. float:2^23 = 8388608,一共七位,这意味着最多能有7位有效数字,但绝对能保证的为6位,也即float的精度为6~7位有效数字: double:2^5

浮点数在金额计算中的使用总结

浮点数在金额计算中的使用总结(摘自~~) double 和 float 类型的变量不适合用作金额计算是java语言使用中的基本知识,但在实际应用中此基本常识经常被程序员忽视,想当然的用在了实际的金额计算场景中,造成难以察觉的错误.在此对金额计算的使用方法做个总结,以规范后续使用. 1. double和float 的不准确 <effective Java>中指出,float和double类型主要是为科学计算和工程计算而设计的,不应该被用于需要精确结果的场合,尤其不适合于货币计算,见如下代码: p

单精度浮点数按存储格式转为整数的程序

/////////////////// #include<cstdio> //----------------- union int_char { unsigned char ch[4]; float i; }; void out_put(union int_char x)//x86是小端对其模式,即最数据的最低位存储在地址的最低位上. { printf("单精度浮点数值为:%f\n",x.i,x.i); printf("存储位置从左到右,从高位到低位依次为 0x

浮点数float累加误差分析与解决

1.  浮点数IEEE 754表示方法 要搞清楚float累加为什么会产生误差,必须先大致理解float在机器里怎么存储的,具体的表示参考[1] 和 [2], 这里只介绍一下组成 由上图可知(摘在[2]), 浮点数由: 符号位 + 指数位 + 尾数部分, 三部分组成.由于机器中都是由二进制存储的,那么一个10进制的小数如何表示成二进制.例如: 8.25转成二进制为1000.01, 这是因为 1000.01 = 1*2^3 + 0*2^2 + 0*2^1 + 0*2^0 + 0*2^-1 + 2*

单精度浮点数和有效位数为什么是7位

IEEE754标准 详细描述了单精度浮点数的格式 详查维基百科IEEE_754-1985  描述了包括如何表示( 规约化 非规约化 0 无穷 NAN)这几类以及为什么要如此表示 尾数位数越多,精度越高:指数位越多,可表示范围越大.物理中常用有效数字来描述此概念.https://zh.wikipedia.org/wiki/%E6%9C%89%E6%95%88%E6%95%B0%E5%AD%97 单精度浮点数的有效位数为什么是7位,找到的答案如下: 浮点数的精度取决于尾数部分.尾数部分的位数越多,能

IEEE浮点数float、double的存储结构

众所周知,C的float.VB的Single都是32位浮点数变量类型(也叫单精度浮点数),C的double和VB的Double则都是64位的浮点数变量类型(也叫双精度浮点数).有些编译器还支持更屌的long double(貌似是80位还是128位的我不清楚,总之存在这种变态玩意儿.)那么这些浮点数从最底层的角度来看,它们是怎么存储的呢?我来举个例子解释下.计算机用的是二进制,如果我用二进制跟大家解释大家可能觉得看不懂,那我就用十进制来跟大家解释.浮点数分三个部分,第一个部分是有效数字,第二个部分

单精度浮点数操作

用数组存储32位单精度浮点数,并且实现有效位右移,有效数加法等,可用于计算机浮点加减法的底层模拟. 1 package com.computerOrganizationAndArchitecture.floatQperation; 2 3 import com.computerOrganizationAndArchitecture.singleprecisionfloat.SinglePrecision; 4 5 /** 6 * Created by XuTao on 2018/12/8 20:

单精度浮点数

单精度浮点数格式 是一种计算机数据格式,在计算机存储器中占用4个字节(32 bits),利用"浮点"(浮动小数点)的方法,可以表示一个范围很大的数值. 在 IEEE 754-2008 的定义中,32-bit base 2格式被正式称为binary32格式.这种格式在IEEE 754-1985被定义为single,即单精度. 需要注意的是,在更早的一些计算机系统中,也存在着其他4字节的浮点数格式. 定义 第1位表示正负,中间8位表示指数,后23位表示有效数位. 正负号0代表正,1代表负.

使用kaptcha插件生成加法计算验证码

1.从官网https://code.google.com/p/kaptcha/下载kaptcha压缩文件,解压文件后里面有一个war文件,打开Eclipse/MyEclipse将其import进去,然后部署到服务器,在浏览器输入url即可看到kaptcha官方提供的基本demo的运行情况,现在将其改为加法计算验证. 2.首先查看web.xml文件发现用来生成验证码的servlet为KaptchaServlet 3.找到KaptchaServlet.class文件,然后进行反编译. 4.新建一个自