一..为什么不用浮点数算钱
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字节浮点数计算工具
在计算机中有关浮点数转二进制的计算方法,里面讲得很清楚,原来是PPT文档,我已转成PDF的格式,看起来非常舒服。在编程中,特别是一些算法中经常用会一些浮点数的计算
浮点数计算是计算机科学中的一个关键领域,特别是在数值计算、科学计算以及工程应用中扮演着重要角色。然而,由于浮点数在计算机中的表示方式和计算过程中的限制,浮点计算往往会产生误差。这篇自己编写的分析文章...
ieee754浮点数计算
输入的时候有两个选项:请收入需要转换的浮点数,这个时候如果是想将十进制的数据转换为浮点数的话 直接输入十进制 如果将报文数据转换成十进制的话就需要在一开始的时候先随便输入一个数据跳过“请收入需要转换的...
**标题解析:** ...总之,“IEEE浮点数计算机内二进制表示显示.vi”涉及的是使用LabVIEW创建的一个工具,用于教学或分析IEEE 754浮点数的内部二进制表示,这对于理解和处理浮点数计算及其潜在问题非常有帮助。
输入4个字节的浮点数,自动装换成浮点数。还有16进制转换
深入介绍浮点数的存储形式,讲解误差形成的缘由!新的层面,新的认知!!
小工具集合:各种数据格式转换;CRC码计算;按位与and/按位或or 等等。很强大很好用
4字节浮点数算法
Delphi GMP库是一个强大的计算工具,专为在Delphi编程环境中处理任意精度整数、有理数和浮点数而设计。这个库基于GNU Multiple Precision Arithmetic Library (GMP),一个广泛使用的开源库,用于执行高精度计算。GMP...
通过这个程序,你可以深入理解浮点数在计算机中的表示和计算过程,这对于进行高性能计算、数值分析或编程语言的底层实现至关重要。它可以帮助你更好地调试浮点运算相关的错误,以及优化依赖浮点精度的算法。
Java对浮点数的计算是不精确的,比如0.05+0.01结果不是0.06,而是0.060000000000000005,更有甚者,一个数除以0.0,Java是不会抛异常,而是得出无穷大的结果.本工具类解决了上述问题.该类提供了加减乘除四则运算的精确计算...
讲解浮点数载计算机中的表示
定点数和浮点数是两种常见的数字表示方式,它们各有特点,适用于不同的计算场景。本课件详细介绍了这两种数字表示方法以及如何进行加减乘除运算。 定点数,顾名思义,是指小数点的位置固定不变的数。它分为两类:有...
本教程将深入探讨如何利用威纶通宏指令进行浮点数的加、减、乘、除以及开方运算,这对于进行精准的数学计算和数据处理至关重要。 浮点数运算在很多应用中比整数运算更为复杂,因为它涉及到小数部分的处理。在威纶...