`

JAVA中控制double和float的精度

    博客分类:
  • java
阅读更多

本篇介绍了在JAVA中如何对double或者float的浮点数进行精度计算,在JAVA中提供了多种参数来实现精度的不同控制方式。具体例子如下: 

转自http://stephen830.iteye.com/blog/260776

Java代码 
  1. /* 
  2.  * Created on 2005-6-5 
  3.  * Author stephen 
  4.  * Email zhoujianqiang AT gmail DOT com 
  5.  * CopyRight(C)2005-2008 , All rights reserved. 
  6.  */  
  7. package com.soft4j.utility;  
  8.   
  9. import java.math.BigDecimal;  
  10.   
  11. /** 
  12.  * 与小数位精度(四舍五入等)相关的一些常用工具方法. 
  13.  *  
  14.  * float/double的精度取值方式分为以下几种: <br> 
  15.  * java.math.BigDecimal.ROUND_UP <br> 
  16.  * java.math.BigDecimal.ROUND_DOWN <br> 
  17.  * java.math.BigDecimal.ROUND_CEILING <br> 
  18.  * java.math.BigDecimal.ROUND_FLOOR <br> 
  19.  * java.math.BigDecimal.ROUND_HALF_UP<br> 
  20.  * java.math.BigDecimal.ROUND_HALF_DOWN <br> 
  21.  * java.math.BigDecimal.ROUND_HALF_EVEN <br> 
  22.  *  
  23.  * @author stephen 
  24.  * @version 1.0.0 
  25.  */  
  26. public final class RoundTool {  
  27.   
  28.     /** 
  29.      * 对double数据进行取精度. 
  30.      * <p> 
  31.      * For example: <br> 
  32.      * double value = 100.345678; <br> 
  33.      * double ret = round(value,4,BigDecimal.ROUND_HALF_UP); <br> 
  34.      * ret为100.3457 <br> 
  35.      *  
  36.      * @param value 
  37.      *            double数据. 
  38.      * @param scale 
  39.      *            精度位数(保留的小数位数). 
  40.      * @param roundingMode 
  41.      *            精度取值方式. 
  42.      * @return 精度计算后的数据. 
  43.      */  
  44.     public static double round(double value, int scale, int roundingMode) {  
  45.         BigDecimal bd = new BigDecimal(value);  
  46.         bd = bd.setScale(scale, roundingMode);  
  47.         double d = bd.doubleValue();  
  48.         bd = null;  
  49.         return d;  
  50.     }  
  51.   
  52.     /** 
  53.      * 测试用的main方法. 
  54.      *  
  55.      * @param argc 
  56.      *            运行参数. 
  57.      */  
  58.     public static void main(String[] argc) {  
  59.         //下面都以保留2位小数为例  
  60.           
  61.         //ROUND_UP  
  62.         //只要第2位后面存在大于0的小数,则第2位就+1  
  63.         System.out.println(round(12.3401,2,BigDecimal.ROUND_UP));//12.35  
  64.         System.out.println(round(-12.3401,2,BigDecimal.ROUND_UP));//-12.35  
  65.         //ROUND_DOWN  
  66.         //与ROUND_UP相反  
  67.         //直接舍弃第2位后面的所有小数  
  68.         System.out.println(round(12.349,2,BigDecimal.ROUND_DOWN));//12.34  
  69.         System.out.println(round(-12.349,2,BigDecimal.ROUND_DOWN));//-12.34  
  70.         //ROUND_CEILING  
  71.         //如果数字>0 则和ROUND_UP作用一样  
  72.         //如果数字<0 则和ROUND_DOWN作用一样  
  73.         System.out.println(round(12.3401,2,BigDecimal.ROUND_CEILING));//12.35  
  74.         System.out.println(round(-12.349,2,BigDecimal.ROUND_CEILING));//-12.34  
  75.         //ROUND_FLOOR  
  76.         //如果数字>0 则和ROUND_DOWN作用一样  
  77.         //如果数字<0 则和ROUND_UP作用一样  
  78.         System.out.println(round(12.349,2,BigDecimal.ROUND_FLOOR));//12.34  
  79.         System.out.println(round(-12.3401,2,BigDecimal.ROUND_FLOOR));//-12.35  
  80.         //ROUND_HALF_UP [这种方法最常用]  
  81.         //如果第3位数字>=5,则第2位数字+1  
  82.         //备注:只看第3位数字的值,不会考虑第3位之后的小数的  
  83.         System.out.println(round(12.345,2,BigDecimal.ROUND_HALF_UP));//12.35  
  84.         System.out.println(round(12.3449,2,BigDecimal.ROUND_HALF_UP));//12.34  
  85.         System.out.println(round(-12.345,2,BigDecimal.ROUND_HALF_UP));//-12.35  
  86.         System.out.println(round(-12.3449,2,BigDecimal.ROUND_HALF_UP));//-12.34  
  87.         //ROUND_HALF_DOWN  
  88.         //如果第3位数字>=5,则做ROUND_UP  
  89.         //如果第3位数字<5,则做ROUND_DOWN  
  90.         System.out.println(round(12.345,2,BigDecimal.ROUND_HALF_DOWN));//12.35  
  91.         System.out.println(round(12.3449,2,BigDecimal.ROUND_HALF_DOWN));//12.34  
  92.         System.out.println(round(-12.345,2,BigDecimal.ROUND_HALF_DOWN));//-12.35  
  93.         System.out.println(round(-12.3449,2,BigDecimal.ROUND_HALF_DOWN));//-12.34  
  94.         //ROUND_HALF_EVEN  
  95.         //如果第3位是偶数,则做ROUND_HALF_DOWN  
  96.         //如果第3位是奇数,则做ROUND_HALF_UP  
  97.         System.out.println(round(12.346,2,BigDecimal.ROUND_HALF_EVEN));//12.35  
  98.         System.out.println(round(12.345,2,BigDecimal.ROUND_HALF_EVEN));//12.35  
  99.     }  
  100. }  


分享到:
评论

相关推荐

    Java中double类型下出现精度计算错误情况下出力方法

    Java中的简单浮点数类型float和double不能够进行运算,因为大多数情况下是正常的,但是偶尔会出现如上所示的问题。这个问题其实不是JAVA的bug,因为计算机本身是二进制的,而浮点数实际上只是个近似值,所以从二进制...

    关于java的数值精度

    java程序中数值的精度问题,float、double容易产生精度数值问题,不适合精度计算,而bigdecimal正好解决这一问题

    解决java数值范围以及float与double精度丢失的问题

    下面小编就为大家带来一篇解决java数值范围以及float与double精度丢失的问题。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    Java与MySQL中小数保存问题解析.pptx.pptx

    在Java和MySQL中,小数的精度可能会受到限制,如float类型的小数只能精确到6-7位,double类型也只能精确到15-16位。 浮点数运算问题 在进行浮点数运算时,可能会出现精度丢失的问题,例如0.1+0.2的结果并不等于0.3...

    Java中各个数据类型之间的转换

    由于实际开发中这样的类型转换很多,所以Java语言在设计时,没有为该操作设计语法,而是由JVM自动完成。 转换规则 从存储范围小的类型到存储范围大的类型。 具体规则为: byte→short(char)→int→long→float→...

    Java Number & Math 类.pdf

    Java Number类提供了以下基本的数字操作:转换,比较,算术运算,取整,取余,取最大值和最小值,取绝对值,取幂,取对数,取根号,取随机数,取符号,取精度,取舍入值等。 三、什么是包装类? 在实际开发过程中,...

    Java基础面试题.doc

    Java中的基本数据类型只有8个:byte、short、int、long、float、double、char、boolean;除了基本类型(primitive type)和枚举类型(enumeration type),剩下的都是引用类型(reference type)。 2、float f=3.4;...

    java-code Java语言程序.rar

    基本类型包括八种、布尔型(Boolean)、字节型(byte)、字符型(char)、短整型(short)、整型(integer)、长整型(long)、浮点型(float)、双精度型(double)。 引用类型包括:类(class)、接口(interface...

    单双精度转十六进制.zip

    单双精度浮点数与十六进制双向转换工具,单双精度浮点数与十六进制双向转换工具,单双精度浮点数与十六进制双向转换工具

    Java中的浮点数分析

     浮点数分为单精度和双精度,Java中的单精度和双精度分别为float和double.你们知道float和double是怎么存储的吗? float占4个字节,double占8个字节,为了方便起见,这里就只讨论float类型. float其实和一个int型的...

    BigDecimal 加减乘除运算

    float和double只能用来做科学计算或者是工程计算,在商业计算中要用java.math.BigDecimal。BigDecimal所创建的是对象,我们不能使用传统的+、-、*、/等算术运算符直接对其对象进行数学运算,而必须调用其相对应的...

    Java中BigDecimal的加减乘除、比较大小与使用注意事项

    对于不需要任何准确计算精度的数字可以直接使用float或double,但是如果需要精确计算的结果,则必须使用BigDecimal类,而且使用BigDecimal类也可以进行大数的操作,下面这篇文章给大家介绍了Java中BigDecimal的加减...

    java开发面试题及答案

    答:有问题,因为3.4 是双精度数,将双精度型(double)赋值给浮点型(float)属于向下转型,可能会造成精度损失,所以必须进行强制类型转换,正确的写法是float number =(float)3.4;/ float number =3.4F;。 Q3:...

    Java-关于基本数据类型中浮点数计算产生的精度问题

    在基本数据类型中,float和double都表示浮点型数据,而计算机计算采取的是对二进制的计算,所以会存在一定程度上的精度丢失问题。 BigDecimal类是一个大小数操作类,可以用来对超过16位有效位的数据进行精确的运算,...

    float型和double型数据的存储方式1

    奇怪输出结果:首先我们看看2.25的单精度存储方式,2.25 --&gt; 10.01 --&gt; 1.001*21符号位0,指数部分1+127 --&gt; 10000000

    java综合试题(面试题)

    13. Java语言中的浮点型数据根据数据存储长度和数值精度的不同,进一步分为哪两种具体类型,各占二进制的多少位? 16.字符串 ”\’a\’” 的长度是( )3 13. float 32位、double 64位 24.表达式2*5/2.5、1.0/2*5、...

    浮点数的数据结构.pdf

    在JAVA中,通常使⽤的浮点数的类型为 FLoat和Double,他们的区别在于⼤⼩与储存⽅式不同 public class App { public static void main(String[] args) { System.out.println("Float:"+Float.SIZE); System.out....

    Android数据类型之间相互转换系统介绍

    一些初学Android的朋友可能会遇到JAVA的数据类型之间转换的苦恼,例如,整数和float,double型之间的转换,整数和String类型之间的转换,以及处理、显示时间方面的问题等。下面笔者就开发中的一些体会介绍给大家。 ...

    java面试800题

    外键是从某个表的一个字段指向另外一个表的主健字段,两个字段的类型和精度应该一致,外键的值必须在主键中存在 Q0030 在数据库中什么代表一条记录? 主健 Q0031 如何编写效率高的SQL语句? "1.根据查询条件建立...

    JAVA8大数据类型.pdf

    不同类型数据间的优先关系如下: 低---------------------------------------------&gt;⾼ byte,short,char-&gt; int -&gt; long -&gt; float -&gt; double 运算中,不同类型的数据先转化为同⼀类型,然后进⾏运算,转换规则如下: ...

Global site tag (gtag.js) - Google Analytics