一..为什么不用浮点数算钱
1. 浮点运算在计算过程中需要对阶,而在对阶过程中可能损失精度,即尾数部分被舍弃。
public class TestDouble { public static void main(String[] args) { Double a = 1.0e15; for (int i = 0; i < 1000000; i++) { a += 0.01d; } System.out.println(a); DecimalFormat decimalFormat = new DecimalFormat("0.00"); System.out.println(decimalFormat.format(a)); } }
结果如下
1.0E15 1000000000000000.00
实际结果应该是
public static void main(String[] args) { BigDecimal bigDecimal = new BigDecimal("1000000000000000"); BigDecimal add = new BigDecimal("0.01"); for (int i = 0; i < 1000000; i++) { bigDecimal = bigDecimal.add(add); } System.out.println(bigDecimal.toPlainString()); }
1000000000010000.00
少算了10000元。
如果把1.0e15改成1.0e8即1千万,则相差0.01,但如果循环次数变得更多,则相差更大。
二.为了解决这种问题,JAVA提供了BigDecimal来解决高精度计算问题。
它有两个优点:
1.精度比浮点数高得多,可以指定任一精度,不会像浮点数一样因为对阶造成精度丢失。
2.符合十进制的运算规则,可指定舍入策略,比如四舍五入等。
需要注意的点:
1.初始化时,最好用字符串。用数字的话,小数数字可能不精确,因为有限的十进制小数,在二进制中可能变为无限小数,见BigDecimal的构造函数解释
2.在除法操作时,要指定精度和舍入策略,如果不设定传入策略,当出现除不尽的情况时会报异常。
BigDecimal |
divide(BigDecimal divisor, int scale, RoundingMode roundingMode) 返回一个 BigDecimal,其值为 (this / divisor),其标度为指定标度。 |
BigDecimal |
divide(BigDecimal divisor, MathContext mc) 返回其值为 (this / divisor) 的 BigDecimal(根据上下文设置进行舍入)。 |
3.BigDecimal是不可变对象,每次运算的结果都体现在返回的BigDecimal对象上,原对象不变。
相关推荐
本文将详细讨论“4字节浮点数计算工具”及其相关的知识点,包括浮点数的表示、16进制与10进制的转换以及在电力通信规约中的应用。 首先,浮点数是一种用于表示实数的数据类型,广泛应用于科学计算和计算机图形学等...
在JavaScript编程中,浮点数计算不精确是一个常见的问题,源于其内部的二进制浮点数表示方式。本文将深入探讨这个问题,并提供解决方案。首先,我们要理解为什么会出现这种不精确性。 JavaScript遵循IEEE 754标准来...
浮点数计算软件是一款专为理解和处理浮点数计算而设计的应用程序,它能够帮助用户了解4字节的二进制数值如何表示浮点数,这对于通讯传输和算法调试等场景具有很高的实用价值。在IT行业中,理解浮点数的表示和计算...
表达式计算(浮点数计算) 本篇文章主要介绍了浮点数计算的实现方法,通过分析给定的代码,解释了浮点数表达式计算的原理和实现细节。 一、浮点数表达式计算概述 浮点数表达式计算是指对浮点数表达式进行计算的...
4字节浮点数计算工具
### 浮点数计算与误差分析 #### 一、浮点数的基本概念 浮点数是一种用于表示实数的数据类型,广泛应用于计算机科学中的数值计算领域。为了更好地理解浮点数及其运算中可能出现的误差问题,我们需要从浮点数的表示...
### 浮点数的计算方法 #### 一、引言 在计算机科学中,浮点数是一种用于表示实数的数据类型。它通过一种特定的方式来存储数值,使得可以在有限的存储空间内表示非常大或非常小的数值。浮点数的表示方法主要遵循...
浮点数计算是计算机科学中的一个关键领域,特别是在数值计算、科学计算以及工程应用中扮演着重要角色。然而,由于浮点数在计算机中的表示方式和计算过程中的限制,浮点计算往往会产生误差。这篇自己编写的分析文章...
ieee754浮点数计算
**标题解析:** ...总之,“IEEE浮点数计算机内二进制表示显示.vi”涉及的是使用LabVIEW创建的一个工具,用于教学或分析IEEE 754浮点数的内部二进制表示,这对于理解和处理浮点数计算及其潜在问题非常有帮助。
输入4个字节的浮点数,自动装换成浮点数。还有16进制转换
浮点数计算错误是计算机科学中的一个经典问题,它源于计算机用二进制格式存储数字的方式,以及二进制在表示某些十进制小数时的局限性。首先,需要了解的是,浮点数不是计算机中用于表示小数的精确方式。计算机使用的...
输入的时候有两个选项:请收入需要转换的浮点数,这个时候如果是想将十进制的数据转换为浮点数的话 直接输入十进制 如果将报文数据转换成十进制的话就需要在一开始的时候先随便输入一个数据跳过“请收入需要转换的...
小工具集合:各种数据格式转换;CRC码计算;按位与and/按位或or 等等。很强大很好用
Delphi GMP库是一个强大的计算工具,专为在Delphi编程环境中处理任意精度整数、有理数和浮点数而设计。这个库基于GNU Multiple Precision Arithmetic Library (GMP),一个广泛使用的开源库,用于执行高精度计算。GMP...
这种格式遵循IEEE 754标准,被广泛应用于各种计算环境中。 #### 二、4字节浮点数结构 根据提供的内容,“4字节浮点数”是由四个字节组成,每个字节分为高四位和低四位,这与传统的IEEE 754浮点数编码方式有所不同...
通过这个程序,你可以深入理解浮点数在计算机中的表示和计算过程,这对于进行高性能计算、数值分析或编程语言的底层实现至关重要。它可以帮助你更好地调试浮点运算相关的错误,以及优化依赖浮点精度的算法。
浮点数在计算机中的表示是计算科学中一个关键的概念,特别是在数值分析、科学计算和工程应用中。IEEE 754标准是当前最普遍使用的浮点数表示法,被广泛应用于包括基于Intel的PC、Macintosh以及大多数Unix平台在内的...
Java对浮点数的计算是不精确的,比如0.05+0.01结果不是0.06,而是0.060000000000000005,更有甚者,一个数除以0.0,Java是不会抛异常,而是得出无穷大的结果.本工具类解决了上述问题.该类提供了加减乘除四则运算的精确计算...
定点数和浮点数是两种常见的数字表示方式,它们各有特点,适用于不同的计算场景。本课件详细介绍了这两种数字表示方法以及如何进行加减乘除运算。 定点数,顾名思义,是指小数点的位置固定不变的数。它分为两类:有...