`

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-float-String

    标题中的"Java 精确计算 - double-float-String"指向的是Java中处理浮点数(double和float)以及字符串表示的数值时可能遇到的精度问题,以及如何通过特定方法实现精确计算。描述中提到的链接指向了一个具体的博客...

    详解java中float与double的区别

    Java 中 float 和 double 的区别详解 float 和 double 是 Java 中两种基本数据类型,都是用来表示实数的,但是它们有很大的区别。float 是单精度类型,精度是 8 位有效数字,取值范围是 10 的 -38 次方到 10 的 38 ...

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

    下面我们将详细探讨Java中的数值范围、float和double类型的精度问题,并且提供解决方案。 一、Java中的数值范围 Java中的基本数据类型有多种,包括整数类型(int、long)、浮点数类型(float、double)。每种类型...

    float和double

    float和double浮点数类型的精度和范围解析 浮点数类型float和double是编程语言中最常用的数值类型,但是它们...因此,在商业计算中,我们应该使用java.math.BigDecimal来避免精度问题,而不是使用float和double类型。

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

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

    float、double类型介绍.zip

    标题中的“float、double类型介绍”指的是在编程语言中,如C++、Java或Python等,用于表示浮点数的数据类型。浮点数是计算机科学中用来表示小数的一种方式,因为它们不是精确的,而是近似的。浮点类型通常分为两种...

    Java实现IEE754 Float类型数据

    本文将详细探讨如何使用Java语言来实现IEEE 754标准中的单精度浮点数(Float)的解析过程。 #### IEEE 754标准简介 IEEE 754标准定义了浮点数的二进制格式以及运算规则。对于单精度浮点数来说,它占用32位(4字节...

    java-16进制4字节转Float

    在Java中,浮点数有两种主要形式:单精度浮点数(float)和双精度浮点数(double),它们分别使用32位和64位来存储。 1. **字节序**:在进行16进制到浮点数的转换时,必须考虑到字节序,即字节在内存中的排列顺序。...

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

    总的来说,理解和处理Java与MySQL中的小数问题,关键在于选择合适的数据类型、控制精度并适当地进行运算处理,以确保数据的准确性和一致性。在开发过程中,应充分考虑这些因素,以避免潜在的精度误差和数据不一致...

    16位转浮点型float,MODBUS 32位转浮点型float 64位转双浮点型double

    在IT领域,数据类型转换是常见的操作,尤其是在通信协议如MODBUS中,为了高效传输和正确解析数据,需要将数值转换成不同的格式。本篇主要介绍16位、32位以及64位数据如何转换为浮点型(float)和双浮点型(double)...

    关于java的数值精度

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

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

    本文主要探讨了浮点类型数据,即float和double在内存中的表示方式,以及由此产生的精度问题。 首先,浮点类型数据有两种主要形式:单精度(float)和双精度(double)。float在内存中占用32位,而double占用64位。这...

    Java源码获取浮点数类型的最大最小值

    在Java编程语言中,浮点数类型包括`float`和`double`,它们分别用于存储单精度和双精度浮点数。了解如何在源码级别获取这两种类型的最大和最小值对于编写高效且精确的代码至关重要。本文将深入探讨Java中获取浮点数...

    C#和java数据类型的等价类型

    它们都可以用来存储逻辑值,以便于在程序中进行逻辑判断和控制流程。 二、整数类型 C#和Java都支持多种整数类型,包括 byte、short、int、long 等。这些类型都可以用来存储整数值,但它们的取值范围和存储大小不同...

    浅谈Java中的高精度整数和高精度小数

    Java 中的高精度整数和高精度小数 Java 中的高精度整数和高精度小数是指在 Java 编程语言中对大整数和小数的处理。高精度整数和高精度小数在实际应用中非常重要,例如在计算金钱的时候需要保留高精度小数,以避免...

    Java BigDecimal和double示例及相关问题解析

    在 Java 中,浮点数的表示形式有多种,包括 float 和 double 等,但是这些类型在进行计算时会出现精度问题,而 BigDecimal 则可以解决这种问题。本文将主要介绍 Java 中的 BigDecimal 和 double 的示例及相关问题...

    Java数据类型和MySql数据类型对应一览

    在 Java 中,数字类型对应的是 java.lang.Integer、java.lang.Long、java.lang.Float、java.lang.Double 等类型。在 MySql 中,数字类型对应的是 INTEGER、BIGINT、FLOAT、DOUBLE 等类型。其中,INTEGER 类型用于...

    java中double转化为BigDecimal精度缺失的实例

    在Java编程语言中,数值类型如`double`和`float`虽然方便进行浮点数运算,但它们在处理精度上存在一定的局限性。这主要是由于它们是基于二进制浮点数表示法,而非十进制。在进行计算时,某些十进制小数无法精确地...

    实验Java的基本数据类型和作业流程控制结构.doc

    Java 语言中有两种浮点数类型:float 和 double。float 占 4 字节空间,double 占 8 字节空间。在 Java 语言中,直接写出的浮点数被认为是 double 类型。 例如: ```java float x = 3.25f; double y = 37.4; ``` ...

    Java中数据类型和MYSQL中数据类型的对比

    FLOAT 和 DOUBLE 用于存储近似数值,与 Java 中的浮点类型相对应。BIT 类型用于存储位字段值,适用于二进制数据。 2. 日期和时间类型:MySQL 的日期和时间类型包括 DATETIME、DATE、TIMESTAMP、TIME 和 YEAR。...

Global site tag (gtag.js) - Google Analytics