`
annan211
  • 浏览: 460909 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

double 浮点数据精确度

    博客分类:
  • java
 
阅读更多
/*
 * 
 * 
 * 
 *  版权所有,并保留所有权利。
 * 
 */
package com.legendshop.util;

import java.math.BigDecimal;

/**
 * 
 * 
 * 
 * 官方网站:
 * 
 */
public class Arith {
	// 默认除法运算精度
	/** The Constant DEF_DIV_SCALE. */
	private static final int DEF_DIV_SCALE = 10;

	// 这个类不能实例化
	/**
	 * Instantiates a new arith.
	 */
	private Arith() {
	}

	/**
	 * 提供精确的加法运算。.
	 * 
	 * @param v1
	 *            被加数
	 * @param v2
	 *            加数
	 * @return 两个参数的和
	 */
	public static double add(double v1, double v2) {
		BigDecimal b1 = new BigDecimal(Double.toString(v1));// 必须转换成String
		BigDecimal b2 = new BigDecimal(Double.toString(v2));
		return b1.add(b2).doubleValue();
	}

	/**
	 * 提供精确的减法运算。.
	 * 
	 * @param v1
	 *            被减数
	 * @param v2
	 *            减数
	 * @return 两个参数的差
	 */
	public static double sub(double v1, double v2) {
		BigDecimal b1 = new BigDecimal(Double.toString(v1));
		BigDecimal b2 = new BigDecimal(Double.toString(v2));
		return b1.subtract(b2).doubleValue();
	}

	/**
	 * 提供精确的乘法运算。.
	 * 
	 * @param v1
	 *            被乘数
	 * @param v2
	 *            乘数
	 * @return 两个参数的积
	 */
	public static double mul(double v1, double v2) {
		BigDecimal b1 = new BigDecimal(Double.toString(v1));
		BigDecimal b2 = new BigDecimal(Double.toString(v2));
		return b1.multiply(b2).doubleValue();
	}

	/**
	 * 提供(相对)精确的除法运算,当发生除不尽的情况时,精确到 小数点以后10位,以后的数字四舍五入。.
	 * 
	 * @param v1
	 *            被除数
	 * @param v2
	 *            除数
	 * @return 两个参数的商
	 */
	public static double div(double v1, double v2) {
		return div(v1, v2, DEF_DIV_SCALE);
	}

	/**
	 * 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指 定精度,以后的数字四舍五入。.
	 * 
	 * @param v1
	 *            被除数
	 * @param v2
	 *            除数
	 * @param scale
	 *            表示表示需要精确到小数点以后几位。
	 * @return 两个参数的商
	 */
	public static double div(double v1, double v2, int scale) {
		if (scale < 0) {
			throw new IllegalArgumentException("The scale must be a positive integer or zero");
		}
		BigDecimal b1 = new BigDecimal(Double.toString(v1));
		BigDecimal b2 = new BigDecimal(Double.toString(v2));
		return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
	}

	/**
	 * 提供精确的小数位四舍五入处理。.
	 * 
	 * @param v
	 *            需要四舍五入的数字
	 * @param scale
	 *            小数点后保留几位
	 * @return 四舍五入后的结果
	 */
	public static double round(double v, int scale) {
		if (scale < 0) {
			throw new IllegalArgumentException("The scale must be a positive integer or zero");
		}
		BigDecimal b = new BigDecimal(Double.toString(v));
		BigDecimal one = new BigDecimal("1");
		return b.divide(one, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
	}

	// 最后我们利用BigDecimal提供的精确计算

	/**
	 * The main method.
	 * 
	 * @param args
	 *            the arguments
	 */
	public static void main(String[] args) {
		// 直接使用浮点数进行计算,得到的结果是有问题的
		System.out.println(0.01 + 0.05);
		// 使用了BigDecimal类进行计算后,可以做到精确计算
		System.out.println(Arith.add(0.05, 0.01));

		System.out.println(1.0 - 0.42);
		System.out.println(Arith.sub(1.0, 0.42));
		System.out.println(4.015 * 100);
		System.out.println(Arith.mul(4.015, 100));
		System.out.println(123.3 / 100);
		System.out.println(Arith.div(123.3, 100, 2));

		/*
		 * 0.060000000000000005 0.06 0.5800000000000001 0.58 401.49999999999994
		 * 401.5 1.2329999999999999 1.233
		 */

	}
}
分享到:
评论

相关推荐

    S7-200SMART 双精度浮点型数据转换为单精度浮点型的方法.pdf

    4. 确保转换后的单精度数据能正确表示原双精度数据的数值。 通过上述方法,S7-200 SMART PLC能够将复杂的双精度浮点数转换为更适合控制任务使用的单精度浮点数,从而提高程序的运行效率和控制精度。在自动化控制...

    matlab数组字符串 非double型数值-单精度浮点型数据类型 算法开发、数据可视化、数据分析 数值计算 Matlab课程

    在MATLAB编程环境中,处理不同类型的数据是至关重要..."31 非double型数值-单精度浮点型数据类型.mp4"这个视频文件很可能是课程的关键教学内容,详细讲解了如何在实际操作中运用单精度数据类型进行各种计算和分析任务。

    16进制数据与浮点型数据转换——c语言程序

    浮点型数据是计算机用来表示小数的类型,包括单精度浮点数(float)和双精度浮点数(double)。在C语言中,float占用4字节(32位),而double占用8字节(64位)。它们的值由一个符号位、指数部分和尾数部分组成,...

    深析C语言浮点型数据的输入输出.pdf

    浮点型数据可以分为单精度(float或single)、双精度(double)和长双精度(long double)三类。根据IEEE 754标准,浮点型数据的二进制编码不同于整型数和字符型数。在C语言中,一般只涉及float类型和double类型数。...

    java double:双精度浮点型.txt

    java double:双精度浮点型

    C语言单精度浮点转换工具

    "C语言单精度浮点转换工具"是一款专为C语言开发者设计的小型实用程序,它能帮助将16进制32位数据转化为浮点数。这个功能在特定情况下非常有用,比如当开发者需要处理存储在内存或文件中的二进制浮点数据时。 首先,...

    8位16进制与浮点double的转换工具

    "8位16进制与浮点double的转换工具"是一个专为理解和操作二进制数据而设计的实用程序,尤其关注IEEE 754标准,这是现代计算机系统中浮点数的标准表示方式。以下是对这个工具和相关知识点的详细解释: 浮点数表示法...

    十六进制(HEX)和浮点类型(float、double)转换工具

    而浮点类型,如float和double,是用于存储小数的数值类型,广泛应用于科学计算、图形处理等领域。了解和掌握十六进制与浮点类型的转换是每一位IT专业人员的基本技能。 十六进制是一种逢16进1的计数系统,使用16个...

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

    双浮点型(double)是64位的浮点数,提供更高的精度。同样遵循IEEE 754标准,64位数据由1位符号位、11位指数位和52位尾数组成。转换过程类似于32位转浮点,只是涉及的位数更多,计算也更为复杂。 在编程语言如C、...

    soft_double:soft_double提供双精度浮点数据类型的C ++软件实现

    soft_double soft_double提供了64位双精度浮点数据类型的C ++软件实现。 一些编译器不支持内置的64位浮点类型,例如通常被称为double或long double 。 例如,通常用于Arduino等8位嵌入式系统或独立裸机AVR的avr-gcc...

    十进制和十六进制转换成float、double数据

    在计算机科学中,数据通常以不同的进制表示,如十进制、十六进制等。在MATLAB和FPGA(Field Programmable Gate Array)设计中,理解和操作不同进制之间的转换是至关重要的。本文将详细讲解如何将十进制和十六进制...

    double类型精度丢失;double转换到64位整数

    `double`是C++、Java等编程语言中的一种数据类型,它用于表示带有小数部分的数值,通常可以精确到15位十进制数。然而,由于浮点数的二进制表示方式,当进行某些计算或转换时,可能会出现精度丢失的问题。标题提到的...

    HEX-Float转换工具 16进制转成float 或double类型数据的一个小工具

    特别是在处理二进制数据或者进行低级编程时,了解如何将十六进制(HEX)转换为浮点数(float)或双精度浮点数(double)至关重要。这个"HEX-Float转换工具"就是这样一个实用程序,它帮助用户方便快捷地完成这种转换...

    S7-200SMART中如何把1个INT整型数据转换成REAL浮点型数据?.docx

    INT类型在S7-200SMART中通常用于存储整数值,而REAL类型则用于存储带有小数部分的浮点数值,适用于需要更精确计算的场合。 首先,我们需要了解S7-200SMART中的数据类型。INT数据类型占用两个字节(16位),其值范围...

    arcgis数据类型

    4. **双精度(Double)**:双精度浮点数提供了更高的精度,范围大致在-2.2E308到1.8E308之间,占用8个字节。在需要更高精度或更大数值范围时,双精度是更好的选择。 5. **文本型(Text)**:文本型用于存储字符串...

    浮点型数据与IEEE754标准互转

    在实际应用中,理解浮点型数据与IEEE754标准的转换非常重要,因为这有助于我们更好地理解和处理浮点数的精度问题、溢出和下溢等问题。例如,在网络传输、文件存储或者序列化过程中,可能需要将浮点数转换为二进制...

    64位16进制字符串to双精度浮点数_labview_64位浮点_双精度_源码.zip

    LabVIEW中的数据类型包含各种数值类型,如整型、单精度浮点、双精度浮点等。在进行16进制字符串到双精度浮点数的转换时,LabVIEW提供了相应的函数和VI(Virtual Instruments)来实现这一过程。这些函数通常会先将16...

    64位16进制字符串to双精度浮点数_labview_64位浮点_双精度

    双精度浮点数(Double Precision)是一种浮点数类型,它使用64位(8字节)存储一个数值,可以提供非常高的精度和广泛的数值范围。在二进制表示中,64位双精度浮点数遵循IEEE 754标准,其结构分为三个部分:符号位(1...

    C语言的数据类型→浮点型数据[收集].pdf

    3. `long double`:长双精度浮点型,根据实现的不同,可能占用10或12个字节,提供最大的精度。 四、浮点型常量的类型 浮点型常量可以是上述三种类型的任何一种,但默认情况下,没有类型修饰符的浮点数被视为`...

Global site tag (gtag.js) - Google Analytics