首先明确的是:Java中的浮点数类型的float和double是不能够用来进行资金的运算。
在《Effective Java》中也提到这个原则:float和double只能用来做科学计算或者是工程计算,在商业计算中我们要用java.math.BigDecimal。
怎样在实际中应用呢,其实也不难。简单提几点:
1. 数据库表的设计
资金字段的数据类型一般定义为number类型,长度可根据需要而定。
2. hibernate中po的属性的数据类型的定义
有两种选择,建议用double,float会有精度丢失的问题。hibernate映射工具自动生成的.hbm.xml中,默认也是double类型。
3.程序中资金的运算
必须使用java.math.BigDecimal,而不能使用float或者double。建议写个工具类,提供些常用的方法供加减等运算使用。
public class Test {
public static void main(String args[]) {
System.out.println(0.05 + 0.01);
System.out.println(1.0 - 0.42);
System.out.println(4.015 * 100);
System.out.println(123.3 / 100);
}
}
你没有看错!结果确实是
0.060000000000000005
0.5800000000000001
401.49999999999994
1.2329999999999999
Java中的简单浮点数类型float和double不能够进行运算。不光是Java,在其它很多编程语言中也有这样的问题。在大多数情况下,计算的结果是准确的,但是多试几次(可以做一个循环)就可以试出类似上面的错误。现在终于理解为什么要有BCD码了。
这个问题相当严重,如果你有9.999999999999元,你的计算机是不会认为你可以购买10元的商品的。
在有的编程语言中提供了专门的货币类型来处理这种情况,但是Java没有。
分享到:
相关推荐
Java中的`BigDecimal`类是用于表示和操作高精度浮点数的重要工具,尤其适用于需要进行精确计算的场景,如财务和货币计算。由于基本数据类型`double`和`float`在进行大数值或高精度计算时可能会导致精度丢失,因此`...
JAVA基础:java.math.BigDecimal的使用方法. JAVA基础:java.math.BigDecimal的使用方法.
在Java编程语言中,处理大数(大数据量的整数)加法时,通常会使用`java.math.BigDecimal`类。这个类提供了精确的浮点数运算,特别适合于需要高精度计算的情况,如金融计算或者复杂的数学运算。下面将详细讨论`...
Java中BigInteger的数学运算,BigDecimal 加减乘除运算,Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double可以处理16位有效数。在实际应用中,需要对更大...
在Java编程语言中,`java.lang.Math`类提供了一系列用于执行基本数学运算的方法和常量。这个类包含静态方法和常量,使得开发者无需实例化对象即可直接调用其功能,极大地简化了数学计算的过程。 ### 常量 #### ...
* java.math 是 Java 2 Platform 的一部分,提供了用于执行任意精度整数算法 (BigInteger) 和任意精度小数算法 (BigDecimal) 的类。 21、网络应用程序:java.net 为实现网络应用程序提供类。 * java.net 是 Java 2...
Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double可以处理16位有效数。在实际应用中,需要对更大或者更小的数进行运算和处理。float和double只能用来做...
Java Double相加出现的怪事 Java 中的浮点数类型 float 和 double 在进行运算时会出现不精确的问题,这是因为计算机无法精确地表示十进制小数。...在商业计算中,我们应该使用 java.math.BigDecimal 来解决这个问题。
除了这些基本的数学操作,Java还提供了其他类来处理复数(`java.math.Complex`),大数(`java.math.BigInteger`和`java.math.BigDecimal`)以及高精度浮点数(`java.math.BigDecimal`)。这些类在需要更高精度或更...
`BigDecimal`类在Java等其他语言中是专门用来处理高精度十进制数的,它提供了丰富的算术运算方法,确保计算结果的精确性。在JavaScript中,虽然没有内置的`BigDecimal`类,但开发者可以通过第三方库来实现类似的功能...
在Java编程语言中,`Math`类提供了几个用于处理数值的静态方法,其中包括`Math.round()`, `Math.ceil()`, 和 `Math.floor()`。这些方法主要用于处理浮点数,将它们转换成整数,但每种方法的取整策略不同。下面我们将...
下面是关于 BigDecimal 的使用方法和注意事项: 1. 导包:在使用 BigDecimal 之前,需要导入 java.math.BigDecimal 包。 2. 创建 BigDecimal 对象:可以通过多种方式创建 BigDecimal 对象,例如将 double 或 ...
在Java编程语言中,`BigDecimal` 类位于 `java.math`...总的来说,`BigDecimal` 类是Java中处理高精度计算的重要工具,理解其构造函数和方法的用法,以及如何避免精度问题,对于编写准确的财务或科学计算程序至关重要。
java.math 提供用于执行任意精度整数算法 (BigInteger) 和任意精度小数算法 (BigDecimal) 的类。 java.net 为实现网络应用程序提供类。 java.nio 定义作为数据容器的缓冲区,并提供其他 NIO 包的概述。 java.nio....
这两个类位于`java.math`包下,为开发者提供了超越基本数据类型(如int、long和double)的计算能力。在深入分析`BigInteger`和`BigDecimal`的源代码之前,我们先来理解这两个类的基本概念和用途。 `BigInteger`类:...
为了应对浮点数运算可能出现的精度问题,Java提供了`java.math`包,其中包含了一些用于精确数学计算的类,比如`BigDecimal`。本文将深入探讨Java中常用的数学类以及如何进行精确的浮点数运算,包括加减乘除、四舍五...
3. **使用`Byte`, `Short`, `Long`, `Float`, `BigInteger`, `BigDecimal`等类的转换方法**:这些类也有类似的转换方法,如果输入不符合它们的转换规则,都会抛出异常。 处理`NumberFormatException`的方法有以下几...
apache-commons-math3是java的一种科学计算类库,实现科学计算功能的类库其他语言如python、scala都有很多而且很容易找到资料,java可能是由于这方面的需求不多,所以相关的资料较少,详细的使用还是需要自己去研究...
在Java编程语言中,控制输出...总结来说,`NumberFormat`和`java.math`包的`BigInteger`、`BigDecimal`类是Java中处理格式化输出和高精度计算的关键工具。它们提供了丰富的功能,确保了在各种场景下的灵活性和精度。
BigDecimal类位于java.math类包下,提供了多种构造函数和方法来实现精确计算。 首先,我们来看下如何构造一个BigDecimal对象。它的构造函数很多,这里挑选最常用的两个来演示一下:一个就是BigDecimal(double val)...