/*
* Created on 2005-6-5
* Author stephen
* Email zhoujianqiang AT gmail DOT com
* CopyRight(C)2005-2008 , All rights reserved.
*/
package com.soft4j.utility;
import java.math.BigDecimal;
/**
* 与小数位精度(四舍五入等)相关的一些常用工具方法.
*
* float/double的精度取值方式分为以下几种:
* java.math.BigDecimal.ROUND_UP
* java.math.BigDecimal.ROUND_DOWN
* java.math.BigDecimal.ROUND_CEILING
* java.math.BigDecimal.ROUND_FLOOR
* java.math.BigDecimal.ROUND_HALF_UP
* java.math.BigDecimal.ROUND_HALF_DOWN
* java.math.BigDecimal.ROUND_HALF_EVEN
*
* @author stephen
* @version 1.0.0
*/
public final class RoundTool {
/**
* 对double数据进行取精度.
*
* For example:
* double value = 100.345678;
* double ret = round(value,4,BigDecimal.ROUND_HALF_UP);
* ret为100.3457
*
* @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中的`double`和`float`类型在进行数学运算时由于二进制浮点数的表示方式,会存在精度损失。例如,0.1 + 0.2并不等于0.3,而是非常接近但不完全相等的一个值。这种现象是由IEEE 754浮点数标准导致的,而非...
在Java编程中,使用`float`和`double`类型进行浮点数计算时经常会遇到精度丢失的问题。这是因为浮点数在计算机内部是以二进制形式存储的,而某些十进制小数无法用二进制精确表示,从而导致计算结果出现误差。例如,`...
在Java编程语言中,将16进制的4字节数据转换为浮点数是常见的数据处理操作,尤其是在与硬件设备交互或者进行低级通信时。这个过程涉及到字节顺序的理解,以及Java中的数据类型转换。以下是关于这个主题的详细解释。 ...
这篇博客主要探讨了Java中浮点数(包括`float`和`double`类型)运算的特性、存在的问题以及如何应对这些挑战。 首先,Java中的`float`类型占用32位存储空间,它能表示大约6到7位十进制的有效数字,而`double`类型则...
Java中的简单浮点数类型float和double不能够进行运算,因为大多数情况下是正常的,但是偶尔会出现如上所示的问题。这个问题其实不是JAVA的bug,因为计算机本身是二进制的,而浮点数实际上只是个近似值,所以从二进制...
解决java数值范围以及float与double精度丢失...在进行开发时,需要了解Java中的数值范围和浮点数精度问题,以避免出现错误和问题。同时,需要了解解决float和double类型的精度问题的方法,以确保开发的正确性和可靠性。
在Java中,浮点数(float和double)是基于IEEE 754标准的,它们使用二进制浮点表示法,这导致在进行除法、乘法、加法和减法等操作时可能会出现非预期的精度损失。例如,两个看似相等的浮点数在计算后可能因为舍入...
在计算机科学领域中,浮点数的表示方式至关重要,尤其是在处理科学计算、图形渲染等对精度有较高要求的应用场景中。IEEE 754标准定义了一种广泛使用的浮点数表示方法,它被用于大多数现代处理器上。本文将详细探讨...
Java中的浮点数类型主要有`float`和`double`,它们都是基于IEEE 754标准来存储的。这种存储方式允许快速的浮点运算,但牺牲了数值的精确性。例如,某些看似简单的浮点数运算可能会产生非预期的结果,因为它们实际上...
在实际编程中,大多数编程语言如C++、Java、Python等都提供了内置函数来进行浮点数和十六进制之间的转换。例如,在Python中,可以使用`float.hex()`和`float.fromhex()`方法实现这一过程。 理解这些转换机制对编程...
在Java中,主要使用两种浮点数类型:`float`(单精度)和`double`(双精度)。`double`类型的精度更高,通常用于需要高精度计算的场景。 #### 1.2 文件读取机制 在Java中,文件读取通常涉及到输入流(`InputStream`...
Java 中 float 和 double 的区别详解 float 和 double 是 Java 中两种基本数据类型,都是用来表示实数的,但是它们有很大的区别。float 是单精度类型,精度是 8 位有效数字,取值范围是 10 的 -38 次方到 10 的 38 ...
4. **类型转换**:如何将整数转换为浮点数,或者在float和double之间进行转换,以及转换时可能遇到的问题。 5. **运算符优先级**:浮点数运算符与其他运算符的结合性和优先级。 6. **编程语言中的差异**:可能对比了...
双浮点型(double)是64位的浮点数,提供更高的精度。同样遵循IEEE 754标准,64位数据由1位符号位、11位指数位和52位尾数组成。转换过程类似于32位转浮点,只是涉及的位数更多,计算也更为复杂。 在编程语言如C、...
在Java编程语言中,浮点数类型包括`float`和`double`,它们分别用于存储单精度和双精度浮点数。了解如何在源码级别获取这两种类型的最大和最小值对于编写高效且精确的代码至关重要。本文将深入探讨Java中获取浮点数...
在Java中,浮点数有两种类型:float和double。float是单精度浮点数,占用4个字节,精度约为7位小数;double是双精度浮点数,占用8个字节,精度约为15位小数。由于浮点数在计算机内部是以二进制形式存储的,因此可能...
在 Java 编程语言中,处理浮点数的运算与整数运算略有不同,因为浮点数涉及到小数部分的计算。本程序演示了如何在 Java 中将两个浮点数相乘并显示结果。首先,我们需要了解浮点类型的基础知识。 在 Java 中,有两种...
浮点数的数据结构在不同的编程语言中有所差异,但在Java中,主要使用两种浮点数类型:Float和Double。 1. **什么是浮点数**: 浮点数是数值中包含小数点的数字,例如1.1、121.212、-1.11和-222.111。在计算机内部,...
浮点数计算错误是计算机科学中的一个经典问题,...总之,理解计算机浮点数表示的原理和它的限制是十分重要的,这可以帮助开发者在编程时更好地处理数值计算,并通过适当的策略来最小化由于浮点数精度限制所引起的误差。
float和double浮点数类型的精度和范围解析 浮点数类型float和double是编程语言中最常用的数值类型,但是它们...因此,在商业计算中,我们应该使用java.math.BigDecimal来避免精度问题,而不是使用float和double类型。