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

为什么Java中的double和float存在精度问题?深入理解浮点数陷阱 理解浮点数的精度特性是开发者的必备技能。在需要精确计算的场景(如金融系统)必须使用BigDecimal,而在科学计算等场景可以合理使用浮点数。选择合适的数据类型,本质上是在精度与性能之间寻找平衡。这篇文章结合了IEEE 754标准的技术细节和Java语言的具体实现,可以帮助开发者深入理解浮点数精度问题的本质及解决方案。 阅读详情

http://blog.youkuaiyun.com/aya19880214/article/details/45891581


1、float整数计算误差

案例:会员积分字段采用float类型,导致计算会员积分时,7位整数的数据计算结果出现误差。

原因:超出float精度范围,无法精确计算。

float和double的精度是由尾数的位数来决定的。浮点数在内存中是按科学计数法来存储的,其整数部分始终是一个隐含着的“1”,由于它是不变的,故不能对精度造成影响。

float:2^23 = 8388608,一共七位,这意味着最多能有7位有效数字,但绝对能保证的为6位,也即float的精度为6~7位有效数字;
double:2^52 = 4503599627370496,一共16位,同理,double的精度为15~16位。

难道只是位数多大的问题,字段类型换成double就可以解决吗?对于本案例是这样,因为都是整数计算,但如果有小数位,就不一定了,见下面案例。


2、double小数转bigdecimal后四舍五入计算有误差

案例:

double g= 12.35;  

BigDecimal bigG=new BigDecimal(g).setScale(1, BigDecimal.ROUND_HALF_UP); //期望得到12.4

System.out.println("test G:"+bigG.doubleValue()); 

test G:12.3 

原因:

定义double g= 12.35;  而在计算机中二进制表示可能这是样:定义了一个g=12.34444444444444449,
new BigDecimal(g)   g还是12.34444444444444449 
new BigDecimal(g).setScale(1, BigDecimal.ROUND_HALF_UP); 得到12.3
正确的定义方式是使用字符串构造函数:
new BigDecimal("12.35").setScale(1, BigDecimal.ROUND_HALF_UP)


3、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

原因:

那么为什么会出现精度丢失呢?在查阅了一些资料以后,我稍微有了一些头绪,下面是本人的愚见,仅供参考。

    首先得从计算机本身去讨论这个问题。我们知道,计算机并不能识别除了二进制数据以外的任何数据。无论我们使用何种编程语言,在何种编译环境下工作,都要先 把源程序翻译成二进制的机器码后才能被计算机识别。以上面提到的情况为例,我们源程序里的2.4是十进制的,计算机不能直接识别,要先编译成二进制。但问 题来了,2.4的二进制表示并非是精确的2.4,反而最为接近的二进制表示是2.3999999999999999。原因在于浮点数由两部分组成:指数和尾数,这点如果知道怎样进行浮点数的二进制与十进制转换,应该是不难理解的。如果在这个转换的过程中,浮点数参与了计算,那么转换的过程就会变得不可预 知,并且变得不可逆。我们有理由相信,就是在这个过程中,发生了精度的丢失。而至于为什么有些浮点计算会得到准确的结果,应该也是碰巧那个计算的二进制与 十进制之间能够准确转换。而当输出单个浮点型数据的时候,可以正确输出,如

double d = 2.4;
System.out.println(d);

    输出的是2.4,而不是2.3999999999999999。也就是说,不进行浮点计算的时候,在十进制里浮点数能正确显示。这更印证了我以上的想法,即如果浮点数参与了计算,那么浮点数二进制与十进制间的转换过程就会变得不可预知,并且变得不可逆。

    事实上,浮点数并不适合用于精确计算,而适合进行科学计算。这里有一个小知识:既然float和double型用来表示带有小数点的数,那为什么我们不称 它们为“小数”或者“实数”,要叫浮点数呢?因为这些数都以科学计数法的形式存储。当一个数如50.534,转换成科学计数法的形式为5.053e1,它 的小数点移动到了一个新的位置(即浮动了)。可见,浮点数本来就是用于科学计算的,用来进行精确计算实在太不合适了。

4、bigdecimal构造函数使用不当带来异常

案例:

BigDecimal其中一个构造函数以双精度浮点数作为输入,另一个以整数和换算因子作为输入,还有一个以小数的 String 表示作为输入。要小心使用 BigDecimal(double) 构造函数,因为如果不了解它,会在计算过程中产生舍入误差。请使用基于整数或 String 的构造函数。

如果使用 BigDecimal(double) 构造函数不恰当,在传递给 JDBC setBigDecimal() 方法时,会造成似乎很奇怪的 JDBC 驱动程序中的异常。例如,考虑以下 JDBC 代码,该代码希望将数字 0.01 存储到小数字段:

PreparedStatement ps =
    connection.prepareStatement("INSERT INTO Foo SET name=?, value=?");
  ps.setString(1, "penny");
  ps.setBigDecimal(2, new BigDecimal(0.01));
  ps.executeUpdate();

在执行这段似乎无害的代码时会抛出一些令人迷惑不解的异常(这取决于具体的 JDBC 驱动程序),因为 0.01 的双精度近似值会导致大的换算值,这可能会使 JDBC 驱动程序或数据库感到迷惑。JDBC 驱动程序会产生异常,但可能不会说明代码实际上错在哪里,除非意识到二进制浮点数的局限性。相反,使用 BigDecimal("0.01") 或 BigDecimal(1, 2) 构造 BigDecimal 来避免这类问题,因为这两种方法都可以精确地表示小数。


5、解决浮点数精确计算有误差的方法


在《Effective   Java》这本书中也提到这个原则,float和double只能用来做科学计算或者是工程计算,在商业计算中我们要用java.math.BigDecimal。使用BigDecimal并且一定要用String来够造。

BigDecimal用哪个构造函数?
BigDecimal(double val) 
BigDecimal(String val)   
上面的API简要描述相当的明确,而且通常情况下,上面的那一个使用起来要方便一些。我们可能想都不想就用上了,会有什么问题呢?等到出了问题的时候,才发现参数是double的构造方法的详细说明中有这么一段:
Note: the results of this constructor can be somewhat unpredictable. One might assume that new BigDecimal(.1) is exactly equal to .1, but it is actually equal to .1000000000000000055511151231257827021181583404541015625. This is so because .1 cannot be represented exactly as a double (or, for that matter, as a binary fraction of any finite length). Thus, the long value that is being passed in to the constructor is not exactly equal to .1, appearances nonwithstanding. 
The (String) constructor, on the other hand, is perfectly predictable: new BigDecimal(".1") is exactly equal to .1, as one would expect. Therefore, it is generally recommended that the (String) constructor be used in preference to this one.
原来我们如果需要精确计算,非要用String来够造BigDecimal不可!


6、定点数和浮点数的区别

在计算机系统的发展过程中,曾经提出过多种方法表达实数。典型的比如相对于浮点数的定点数(Fixed Point Number)。在这种表达方式中,小数点固定的位于实数所有数字中间的某个位置。货币的表达就可以使用这种方式,比如 99.00 或者 00.99 可以用于表达具有四位精度(Precision),小数点后有两位的货币值。由于小数点位置固定,所以可以直接用四位数值来表达相应的数值。SQL 中的 NUMBER 数据类型就是利用定点数来定义的。还有一种提议的表达方式为有理数表达方式,即用两个整数的比值来表达实数。

定点数表达法的缺点在于其形式过于僵硬,固定的小数点位置决定了固定位数的整数部分和小数部分,不利于同时表达特别大的数或者特别小的数。最终,绝大多数现代的计算机系统采纳了所谓的浮点数表达方式。这种表达方式利用科学计数法来表达实数,即用一个尾数(Mantissa ),一个基数(Base),一个指数(Exponent)以及一个表示正负的符号来表达实数。比如 123.45 用十进制科学计数法可以表达为 1.2345 × 102 ,其中 1.2345 为尾数,10 为基数,2 为指数。浮点数利用指数达到了浮动小数点的效果,从而可以灵活地表达更大范围的实数。

在MySQL中使用浮点数类型和定点数类型来表示小数。浮点数类型包括单精度浮点数(FLOAT型)和双精度浮点数(DOUBLE型)。定点数类型就是DECIMAL型。mysql的浮点数类型和定点数类型如下表所示:

类型名称字节数负数的取值范围非负数的取值范围
FLOAT 4 -3.402823466E+38~
-1.175494351E-38
0和1.175494351E-38~
3.402823466E+38
DOUBLE 8 -1.7976931348623157E+308~
-2.2250738585072014E-308
0和2.2250738585072014E-308~
1.7976931348623157E+308
DECIMAL(M,D)或DEC(M,D) M+2 同DOUBLE型 同DOUBLE型

从上表中可以看出,DECIMAL型的取值范围与DOUBLE相同。但是,DECIMAL的有效取值范围由M和D决定,而且DECIMAL型的字节数是M+2,也就是说,定点数的存储空间是根据其精度决定的。

7、bigdecimal比等方法

如浮点类型一样, BigDecimal 也有一些令人奇怪的行为。尤其在使用 equals() 方法来检测数值之间是否相等时要小心。 equals() 方法认为,两个表示同一个数但换算值不同(例如, 100.00 和 100.000 )的 BigDecimal 值是不相等的。然而, compareTo() 方法会认为这两个数是相等的,所以在从数值上比较两个 BigDecimal 值时,应该使用 compareTo() 而不是 equals() 。

另外还有一些情形,任意精度的小数运算仍不能表示精确结果。例如, 1 除以 9 会产生无限循环的小数 .111111... 。出于这个原因,在进行除法运算时, BigDecimal 可以让您显式地控制舍入。 movePointLeft() 方法支持 10 的幂次方的精确除法。

与零比较:

int r=big_decimal.compareTo(BigDecimal.Zero); //和0,Zero比较
if(r==0) //等于
if(r==1) //大于
if(r==-1) //小于


8、简化bigdecimal计算的小工具类

如果我们要做一个加法运算,需要先将两个浮点数转为String,然后够造成BigDecimal,在其中一个上调用add方法,传入另一个作为参数,然后把运算的结果(BigDecimal)再转换为浮点数。你能够忍受这么烦琐的过程吗?网上提供的工具类Arith来简化操作。它提供以下静态方法,包括加减乘除和四舍五入:   

public   static   double   add(double   v1,double   v2)   
public   static   double   sub(double   v1,double   v2)   
public   static   double   mul(double   v1,double   v2)   
public   static   double   div(double   v1,double   v2)   
public   static   double   div(double   v1,double   v2,int   scale)   
public   static   double   round(double   v,int   scale)  

  1. import java.math.BigDecimal;    
  2.   
  3. /**  
  4.  * 进行BigDecimal对象的加减乘除,四舍五入等运算的工具类  
  5.  * @author ameyume  
  6.  *  
  7.  */  
  8. public class Arith {    
  9.   
  10.     /**   
  11.     * 由于Java的简单类型不能够精确的对浮点数进行运算,这个工具类提供精   
  12.     * 确的浮点数运算,包括加减乘除和四舍五入。   
  13.     */    
  14.     //默认除法运算精度    
  15.     private static final int DEF_DIV_SCALE = 10;    
  16.            
  17.     //这个类不能实例化    
  18.     private Arith(){    
  19.     }    
  20.   
  21.     /**   
  22.      * 提供精确的加法运算。   
  23.      * @param v1 被加数   
  24.      * @param v2 加数   
  25.      * @return 两个参数的和   
  26.      */    
  27.     public static double add(double v1,double v2){    
  28.         BigDecimal b1 = new BigDecimal(Double.toString(v1));    
  29.         BigDecimal b2 = new BigDecimal(Double.toString(v2));    
  30.         return b1.add(b2).doubleValue();    
  31.     }    
  32.        
  33.     /**   
  34.      * 提供精确的减法运算。   
  35.      * @param v1 被减数   
  36.      * @param v2 减数   
  37.      * @return 两个参数的差   
  38.      */    
  39.     public static double sub(double v1,double v2){    
  40.         BigDecimal b1 = new BigDecimal(Double.toString(v1));    
  41.         BigDecimal b2 = new BigDecimal(Double.toString(v2));    
  42.         return b1.subtract(b2).doubleValue();    
  43.     }    
  44.        
  45.     /**   
  46.      * 提供精确的乘法运算。   
  47.      * @param v1 被乘数   
  48.      * @param v2 乘数   
  49.      * @return 两个参数的积   
  50.      */    
  51.     public static double mul(double v1,double v2){    
  52.         BigDecimal b1 = new BigDecimal(Double.toString(v1));    
  53.         BigDecimal b2 = new BigDecimal(Double.toString(v2));    
  54.         return b1.multiply(b2).doubleValue();    
  55.     }    
  56.   
  57.     /**   
  58.      * 提供(相对)精确的除法运算,当发生除不尽的情况时,精确到   
  59.      * 小数点以后10位,以后的数字四舍五入。   
  60.      * @param v1 被除数   
  61.      * @param v2 除数   
  62.      * @return 两个参数的商   
  63.      */    
  64.     public static double div(double v1,double v2){    
  65.         return div(v1,v2,DEF_DIV_SCALE);    
  66.     }    
  67.   
  68.     /**   
  69.      * 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指   
  70.      * 定精度,以后的数字四舍五入。   
  71.      * @param v1 被除数   
  72.      * @param v2 除数   
  73.      * @param scale 表示表示需要精确到小数点以后几位。   
  74.      * @return 两个参数的商   
  75.      */    
  76.     public static double div(double v1,double v2,int scale){    
  77.         if(scale<0){    
  78.             throw new IllegalArgumentException(    
  79.                 "The scale must be a positive integer or zero");    
  80.         }    
  81.         BigDecimal b1 = new BigDecimal(Double.toString(v1));    
  82.         BigDecimal b2 = new BigDecimal(Double.toString(v2));    
  83.         return b1.divide(b2,scale,BigDecimal.ROUND_HALF_UP).doubleValue();    
  84.     }    
  85.   
  86.     /**   
  87.      * 提供精确的小数位四舍五入处理。   
  88.      * @param v 需要四舍五入的数字   
  89.      * @param scale 小数点后保留几位   
  90.      * @return 四舍五入后的结果   
  91.      */    
  92.     public static double round(double v,int scale){    
  93.         if(scale<0){    
  94.             throw new IllegalArgumentException(    
  95.                 "The scale must be a positive integer or zero");    
  96.         }    
  97.         BigDecimal b = new BigDecimal(Double.toString(v));    
  98.         BigDecimal one = new BigDecimal("1");    
  99.         return b.divide(one,scale,BigDecimal.ROUND_HALF_UP).doubleValue();    
  100.     }    
  101.        
  102.    /**   
  103.     * 提供精确的类型转换(Float)   
  104.     * @param v 需要被转换的数字   
  105.     * @return 返回转换结果   
  106.     */    
  107.     public static float convertsToFloat(double v){    
  108.         BigDecimal b = new BigDecimal(v);    
  109.         return b.floatValue();    
  110.     }    
  111.        
  112.     /**   
  113.     * 提供精确的类型转换(Int)不进行四舍五入   
  114.     * @param v 需要被转换的数字   
  115.     * @return 返回转换结果   
  116.     */    
  117.     public static int convertsToInt(double v){    
  118.         BigDecimal b = new BigDecimal(v);    
  119.         return b.intValue();    
  120.     }    
  121.   
  122.     /**   
  123.     * 提供精确的类型转换(Long)   
  124.     * @param v 需要被转换的数字   
  125.     * @return 返回转换结果   
  126.     */    
  127.     public static long convertsToLong(double v){    
  128.         BigDecimal b = new BigDecimal(v);    
  129.         return b.longValue();    
  130.     }    
  131.   
  132.     /**   
  133.     * 返回两个数中大的一个值   
  134.     * @param v1 需要被对比的第一个数   
  135.     * @param v2 需要被对比的第二个数   
  136.     * @return 返回两个数中大的一个值   
  137.     */    
  138.     public static double returnMax(double v1,double v2){    
  139.         BigDecimal b1 = new BigDecimal(v1);    
  140.         BigDecimal b2 = new BigDecimal(v2);    
  141.         return b1.max(b2).doubleValue();    
  142.     }    
  143.   
  144.     /**   
  145.     * 返回两个数中小的一个值   
  146.     * @param v1 需要被对比的第一个数   
  147.     * @param v2 需要被对比的第二个数   
  148.     * @return 返回两个数中小的一个值   
  149.     */    
  150.     public static double returnMin(double v1,double v2){    
  151.         BigDecimal b1 = new BigDecimal(v1);    
  152.         BigDecimal b2 = new BigDecimal(v2);    
  153.         return b1.min(b2).doubleValue();    
  154.     }    
  155.   
  156.     /**   
  157.     * 精确对比两个数字   
  158.     * @param v1 需要被对比的第一个数   
  159.     * @param v2 需要被对比的第二个数   
  160.     * @return 如果两个数一样则返回0,如果第一个数比第二个数大则返回1,反之返回-1   
  161.     */    
  162.         public static int compareTo(double v1,double v2){    
  163.         BigDecimal b1 = new BigDecimal(v1);    
  164.         BigDecimal b2 = new BigDecimal(v2);    
  165.         return b1.compareTo(b2);    
  166.     }   
  167.   
  168. }  

参考:

http://justjavac.iteye.com/blog/1073775

http://www.iteye.com/problems/51604

http://blog.163.com/howl_prowler/blog/static/2661971520114553211964/

http://www.cnblogs.com/wingsless/p/3426108.html

http://zhidao.baidu.com/link?url=2L4pkHgVCXlwEeDM0GRHY2gYUwR9d2JC3knqxvHwdyrrdz_LwK92gVAaIy3hhKEQYdUwNjMLe_RJO3cl8sJvbcAnFK-_rMS4Oy_viystUEe


告别龟速下载!保姆级教程:用离线包5分钟搞定Arduino IDE的STM32开发环境(附最新库文件) 本文提供了一套完整的Arduino IDE离线配置方案,帮助开发者5分钟快速搭建STM32开发环境。通过详细的板支持包安装指南、文件校验方法和常见问题解决方案,彻底解决GitHub下载慢的问题,提升开发效率。 阅读详情

相关推荐

将3DMax编辑的动画,导入给已经绑定蒙皮好的模型给Unity使用

现在程序猿想做独立游戏,即容易,也难。 说容易,引擎越来越傻瓜化。 说难,到哪去找靠谱的美术? 好在伟大的AssetStore(还有淘宝上)有大批不赖的资源可以用。 现成的模型,是好,但是,没有配套的动作,却是一件让人头疼的事情,即使用IK动画,也不能完美的弥补这一缺陷。 虽然Unity具备 retargeting 功能,但是,也不是万能的,很多情况下,非标准的骨骼会导致

正经的时候都在打游戏 1万+

JAVA基本数据类型范围和float、double精度问题

1.八中数据类型的分类如下: 第一类:整型 byte short int long 第二类:浮点型 float double 第三类:逻辑型 boolean(它只有两个值可取true false) 第四类:字符型 char 2.各种基本数据类型所占的字节: boolean 布尔型 1/8 byte 字节类型 1 cha

XiChuan的博客 1万+

MatterPort3D 数据集下载

【代码】MatterPort3D 数据集下载。

qq_44106838的博客 6774

Java float和double类型的精度和进制

Java float和double类型的精度和进制

qq_44505027的博客 1725

2025美赛C题奥运奖牌榜模型(附代码+全保姆教程)Models for Olympic Medal Tables

伟大教练”效应的测量方法定义奖牌变化率:−−​如果变化率显著为正,且超出历史平均增长率,则认为存在“伟大教练”效应。使用统计方法(如t检验)验证教练到来是否带来显著性差异。

博客 6371

BART non-Cartesian 重建:并行成像 压缩感知

本文主要使用并行成像和压缩感知方法实现non-Cartesian MRI 数据的重建。

张哥频道:电生理信号和磁共振成像 1181

关于double类型的误差问题

以一元二次方程a*x*x+b*x+c=0为例,讲讲关于double类型的误差问题。当a为0时,方程的根为-c/b;当a不为0时,得进一步确定判别式△,△=b*b-4*a*c,令d=△;当d&lt;0,无实根;当d=0,两根为同一值,x1=x1=-c/b;当d&gt;0,由求根公式得到两个不同的根值。其中C语言编程中必用到根号,所以涉及到使用double。double有32位,每一位具有相应的意义,...

TUJI67的博客 4294

基于cnn version_transformer VIT模型的动物图像分类 完整代码+数据 动物分类教程

基于cnn version_transformer VIT模型的动物图像分类 完整代码+数据 动物分类教程

机器学习深度学习业余选手 1001

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

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

weixin_29414105的博客 758

k8s infiniband 和 RoCE(RDMA over Converged Ethernet)

vendors 为设备厂商编号,注意这里不是 ibv_devinfo 命令看到的vendor_id 的值,而是 lspci -n |grep “网卡的bdf” 得到的。如上文所述,启动了两个测试 pod ,登录其中一个 pod(该 pod roce 设备 ip 为 10.56.217.79)如上文所述,启动了两个测试 pod ,登录其中一个 pod(该 pod ip 为 10.96.225.24)说明:文中用到的镜像是自定义的,文末有其Dockerfile 文件。修改该文件,增加污点容忍的内容,如下。

weixin_40548182的博客 1794

[RK3568 Android12] 添加自定义启动脚本

1:定义添加的脚本 2:rk3568_s.mk 中定义打包 3:在启动脚本中init.rk356x.rc添加权限及何时启动 4:添加权限文件file_contexts 5:系统确认是否运行

OpenWrt/WLAN/驱动/Android/嵌入式开发总结 2219

java浮点数误差_Java浮点数float和double精确计算的精度误差问题总结(source)

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

weixin_33968957的博客 799

rk3588 LightSensor适配从驱动到应用层

本文详细介绍了在RK3588平台上实现光感驱动的开发流程。主要包括:1) 在设备树中配置I2C5接口挂载光感设备;2) 编写内核驱动代码实现光感数据采集;3) HAL层通过ioctl与驱动交互;4) 在BoardConfig.mk中启用相关宏定义;5) Framework层通过AutomaticBrightnessController实现自动亮度调节算法;6) 应用层可通过监听系统设置获取光感变化并调整屏幕亮度。整个流程涵盖了从底层驱动到上层应用的完整实现方案,重点解决了光感设备注册、数据采集传输和自动亮度

tzj1058756809的博客 449

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

-- Java中double类型比较大小或相等的方法- https://blog.youkuaiyun.com/liuweiyuxiang/article/details/71104712 在Java中int类型数据的大小比较可以使用双等号,double类型则不能使用双等号来比较大小,如果使用的话得到的结果将永远是不相等,即使两者的精度是相同的也不可以。 float的指数范围为-127~+128,而do...

ShareUs的专栏 6234

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

java浮点数double_Java浮点数float,bigdecimal和double精确计算的精度误差问题总结

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

weixin_39820158的博客 484

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

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

学习到一篇博客内容,值得做一篇笔记: 建议阅读原文,本文只是粗略笔记 原文连接: https://www.cnblogs.com/wangyt223/p/6210916.html 1.double小数转bigdecimal后四舍五入计算有误差 案例: double g= 12.35; BigDecimal bigG=new BigDecimal(g).setScale(1, BigDecimal....

白龙的博客 876

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

关于float浮点数计算精度问题的深入分析

在Java中,或者说在任何一门语言中,float和double两种类型浮点数计算的精度问题都是老生常谈了。在进行跟钱相关的计算时(毕竟是白花花的银子)的时候如果不注意这两种浮点类型往往会出现许多莫名其妙的bug且难以排查,所以我们不管见到什么一股脑全用BigDecimal算了,也是一种你好我好大家好的万金油方案。但是为什么会有浮点数误差?Java中float有效位数为7位为什么却连0.1都存不了?...

半斤米粉闯天下的博客 9798

Java中关于浮点数的算术运算出现精度丢失及Java 浮点数大小比较,JAVA中的float和double的区别

Java 浮点数大小比较,浮点数计算精度丢失问题,JAVA中的float和double的区别

忆往昔的博客 2780

float计算丢精度_float精度损失 int 转 float 为什么有时会丢失精度

float型运算为什么会损失精度float占用32bit,其中24bit用于表示有效数字。float rv = 0.0; rv = 88889999;为什么调试程序的时候发现赋值后rv 编程由于字长有限,浮点数能够精确表示的数是有限的,因而也是离散的。浮点数一般都存在舍入误差,很多数字无法精确表示,浮点数不要用于比较。由于其是近似存储,值越大,精度损失越大,越不精确。如果需要进行不产生舍入误差的精...

weixin_42299756的博客 1943
上一篇: Toolbar 开发实践总结
下一篇: SwipeRefresh 各种实现上拉,下拉刷新
code_dream_wq
博客等级 码龄10年 51粉丝 199原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值