★★★ 本篇引用转载自:《 http://stephen830.iteye.com/blog/260776 》 ★★★
感谢博主
本篇介绍了在JAVA中如何对double或者float的浮点数进行精度计算,在JAVA中提供了多种参数来实现精度的不同控制方式。具体例子如下:
package com.soft4j.utility;
import java.math.BigDecimal;
/**
* 与小数位精度(四舍五入等)相关的一些常用工具方法.
*
* float/double的精度取值方式分为以下几种: <br>
* java.math.BigDecimal.ROUND_UP <br>
* java.math.BigDecimal.ROUND_DOWN <br>
* java.math.BigDecimal.ROUND_CEILING <br>
* java.math.BigDecimal.ROUND_FLOOR <br>
* java.math.BigDecimal.ROUND_HALF_UP<br>
* java.math.BigDecimal.ROUND_HALF_DOWN <br>
* java.math.BigDecimal.ROUND_HALF_EVEN <br>
*
* @author stephen
* @version 1.0.0
*/
public final class RoundTool {
/**
* 对double数据进行取精度.
* <p>
* For example: <br>
* double value = 100.345678; <br>
* double ret = round(value,4,BigDecimal.ROUND_HALF_UP); <br>
* ret为100.3457 <br>
*
* @param value
* double数据.
* @param scale
* 精度位数(保留的小数位数).
* @param roundingMode
* 精度取值方式.
* @return 精度计算后的数据.
*/
public static double round(double value, int scale, int roundingMode) {
BigDecimal bd = new BigDecimal(value);
bd = bd.setScale(scale, roundingMode);
double d = bd.doubleValue();
bd = null;
return d;
}
/**
* 测试用的main方法.
*
* @param argc
* 运行参数.
*/
public static void main(String[] argc) {
//下面都以保留2位小数为例
//ROUND_UP
//只要第2位后面存在大于0的小数,则第2位就+1
System.out.println(round(12.3401,2,BigDecimal.ROUND_UP));//12.35
System.out.println(round(-12.3401,2,BigDecimal.ROUND_UP));//-12.35
//ROUND_DOWN
//与ROUND_UP相反
//直接舍弃第2位后面的所有小数
System.out.println(round(12.349,2,BigDecimal.ROUND_DOWN));//12.34
System.out.println(round(-12.349,2,BigDecimal.ROUND_DOWN));//-12.34
//ROUND_CEILING
//如果数字>0 则和ROUND_UP作用一样
//如果数字<0 则和ROUND_DOWN作用一样
System.out.println(round(12.3401,2,BigDecimal.ROUND_CEILING));//12.35
System.out.println(round(-12.349,2,BigDecimal.ROUND_CEILING));//-12.34
//ROUND_FLOOR
//如果数字>0 则和ROUND_DOWN作用一样
//如果数字<0 则和ROUND_UP作用一样
System.out.println(round(12.349,2,BigDecimal.ROUND_FLOOR));//12.34
System.out.println(round(-12.3401,2,BigDecimal.ROUND_FLOOR));//-12.35
//ROUND_HALF_UP [这种方法最常用]
//如果第3位数字>=5,则第2位数字+1
//备注:只看第3位数字的值,不会考虑第3位之后的小数的
System.out.println(round(12.345,2,BigDecimal.ROUND_HALF_UP));//12.35
System.out.println(round(12.3449,2,BigDecimal.ROUND_HALF_UP));//12.34
System.out.println(round(-12.345,2,BigDecimal.ROUND_HALF_UP));//-12.35
System.out.println(round(-12.3449,2,BigDecimal.ROUND_HALF_UP));//-12.34
//ROUND_HALF_DOWN
//如果第3位数字>=5,则做ROUND_UP
//如果第3位数字<5,则做ROUND_DOWN
System.out.println(round(12.345,2,BigDecimal.ROUND_HALF_DOWN));//12.35
System.out.println(round(12.3449,2,BigDecimal.ROUND_HALF_DOWN));//12.34
System.out.println(round(-12.345,2,BigDecimal.ROUND_HALF_DOWN));//-12.35
System.out.println(round(-12.3449,2,BigDecimal.ROUND_HALF_DOWN));//-12.34
//ROUND_HALF_EVEN
//如果第3位是偶数,则做ROUND_HALF_DOWN
//如果第3位是奇数,则做ROUND_HALF_UP
System.out.println(round(12.346,2,BigDecimal.ROUND_HALF_EVEN));//12.35
System.out.println(round(12.345,2,BigDecimal.ROUND_HALF_EVEN));//12.35
}
}
分享到:
相关推荐
在Java中,浮点数有两种主要形式:单精度浮点数(float)和双精度浮点数(double),它们分别使用32位和64位来存储。 1. **字节序**:在进行16进制到浮点数的转换时,必须考虑到字节序,即字节在内存中的排列顺序。...
### Java中变量类型及其字节长度详解 #### 一、变量定义与分类 在Java编程语言中,**变量**是一个非常基础且重要的概念。简单来说,变量是一个由标识符定义的数据项,它主要包括三个组成部分:类型、名称以及值。...
在Java编程语言中,进行精度计算时,我们经常会遇到浮点数运算导致的精度丢失问题。这是因为Java中的float和double类型是基于IEEE 754标准的,它们无法精确表示所有的小数。为了确保计算结果的精确性,我们需要使用`...
- float和double分别占用四个和八个字节,用于表示浮点数。 - char占用两个字节,表示范围为0到65535,用于表示单个字符。 通过这些详细知识点,我们可以充分理解Java基础中的数据类型、进制转换、以及与之相关的...
- `FLOAT`: 浮点数,Oracle 中有 `FLOAT (24)`,Java 中使用 `java.lang.Float`。 - `INT`: 存储整数,对应 Oracle 的 `NUMBER(10,0)`,Java 中使用 `java.lang.Integer`。 - `LONGBLOB`: 用于存储大对象,与 ...
- `Double.parseDouble(string)`: 字符串转双精度浮点数 - `Arrays.sort(type[] list)`: 排序数组 - `Arrays.binarySearch(type[] list, type key)`: 二分查找 #### 十二、数组 数组是一种存储同类型元素的数据...
- 不能使用Java中的关键字或者保留字作为标识符。 - 字母大小写敏感。 - 名称应具有一定的意义,便于他人阅读理解。 - 根据以上规则,“lname”, “_int”, “$25”是合法的变量名。 - “Ab?1”、“@abc”、...
在IT领域,高精度计算(High Precision Arithmetic)是处理大整数或浮点数时,为了保持数值计算的精确性而采用的一种技术。通常,计算机的内置数据类型(如int、float、double)都有其计算精度限制,对于超出这个...
1. **双精度浮点数(double)**: Java中的`double`数据类型用于存储双精度浮点数,它提供了比单精度浮点数(float)更高的精度,通常用于科学计算或需要精确结果的场景。双精度浮点数占据8字节(64位)的内存空间。 ...
1. Java基础语法和基本数据类型:文件中提到了基本数据类型如float、double、byte、char等。Java定义了八种基本类型,每种类型的大小和值范围都是固定的。例如,int类型占用4个字节,表示整数。float类型占用4个字节...
赋值语句还可以使用关系表达式、逻辑表达式来进行复杂的计算。 #### 四、控制流语句 控制流语句用于控制程序的执行流程,常见的有: - **打印语句**:用于输出结果到控制台或其他输出设备。 ```java System....
- `float`:32位长度的浮点数,适合存储精度不是特别高的小数。 - `double`:64位长度的浮点数,用于存储高精度的小数。 3. **字符型数据(Characters):** - `char`:16位长度的Unicode字符,用于存储单个字符...
2. `double`: 占用8个字节(64位),提供双精度浮点数,具有更高的精度和更大的取值范围,是Java中的默认浮点类型。 在表示浮点数时,可以使用后缀`f`或`F`指定`float`,如`3.14f`,否则默认为`double`类型,如`...
因为3.4是双精度浮点数(double),而`float`类型的变量应该赋值为单精度浮点数。正确的写法应该是: ```java float f = (float)3.4; ``` **5. float f = 1.3 是否正确?** 同样不正确。原因同上,应该显式转换...
- **Java虚拟机浮点运算**:遵循IEEE 754标准,提供单精度(float)和双精度(double)两种浮点数类型。 - **模式**:Java虚拟机支持两种浮点模式,即默认模式和非标准模式。 - **值集转换**:在不同的浮点模式之间...
**Double (双精度浮点数)**:Java中的double类型是一种浮点数类型,占用8个字节(64位)的存储空间,比float类型能表示更精确的小数点后数值。 **Char (字符型)**:Java中的char类型是一种字符类型,占用2个字节(16位...
### Java考试复习资料详解 #### 一、架构模式:B/S与C/S - **B/S架构**(Browser/Server,浏览器/服务器)是一种通过Web浏览器进行访问的应用系统架构。客户端只需要一个Web浏览器即可,无需安装任何软件。所有的...
- 避免使用 `double` 或 `float` 类型进行货币计算。 - 使用 `BigDecimal` 可以确保计算的准确性。 通过以上分析,我们可以了解到,在Java编程过程中,需要注意取余运算符在处理负数时的特性以及浮点数表示上的...
- **`float`**:占用32位,表示单精度浮点数。 - **`double`**:占用64位,表示双精度浮点数。`double`类型比`long`更精确,适合科学计算。 3. **字符型** - **`char`**:占用16位,用于存储单个字符。可以使用...
总之,BigDecimal是Java中解决浮点数精度问题的关键工具,它确保了在进行财务计算或其他需要精确数值的场景下,结果的准确性。在编写涉及到货币计算或其他需要高精度计算的代码时,应优先考虑使用BigDecimal类。