BigDecimal踩坑总结
2023-11-22 19:09:24
使用String类型对BigDecimal进行初始化。String类型字符串在不同系统间通常是使用的UTF-16或UTF-8编码方式,他们的编码是以Unicode编码方式为基础,如果字符串含有汉字,则其所占字节数变为2或3个字节,导致浮点数精度无法得到保证。
这样写非常容易踩坑
BigDecimal bigDecimal = new BigDecimal("123456.123456");
我们期望bigDecimal为123456.123456,但实际上是123456.1234559999999999998889776975374843137383437109832763671875。
这时我们就需要使用字符串全参构造函数
BigDecimal bigDecimal = new BigDecimal("123456.123456", MathContext.DECIMAL64);
在Java中,BigDecimal类是用于处理具有较高精度的数字的。它可以用来进行精确的数学运算,而不会出现舍入误差。BigDecimal类提供了多种方法来对数字进行运算,包括加、减、乘、除、平方根等。
在使用BigDecimal时,需要注意不要使用String类型来初始化BigDecimal对象。因为String类型字符串在不同系统间通常是使用的UTF-16或UTF-8编码方式,他们的编码是以Unicode编码方式为基础,如果字符串含有汉字,则其所占字节数变为2或3个字节,导致浮点数精度无法得到保证。
BigDecimal bigDecimal = new BigDecimal("123456.123456");
我们期望bigDecimal为123456.123456,但实际上是123456.1234559999999999998889776975374843137383437109832763671875。
这是因为在Java中,String类型字符串是以Unicode编码方式存储的。当使用String类型字符串来初始化BigDecimal对象时,Java会将字符串中的每个字符转换为Unicode码,然后将这些Unicode码转换为字节。在转换过程中,可能会出现精度损失。
为了避免精度损失,可以在初始化BigDecimal对象时使用字符串全参构造函数。字符串全参构造函数允许用户指定要使用的舍入模式。可以使用以下代码来使用字符串全参构造函数初始化BigDecimal对象:
BigDecimal bigDecimal = new BigDecimal("123456.123456", MathContext.DECIMAL64);
使用字符串全参构造函数初始化BigDecimal对象时,Java会根据指定的舍入模式将字符串中的数字转换为BigDecimal对象。这样可以避免精度损失。
在使用BigDecimal时,需要注意以下几点:
- 不要使用String类型来初始化BigDecimal对象。
*可以使用字符串全参构造函数来初始化BigDecimal对象,并指定要使用的舍入模式。
*BigDecimal类提供了多种方法来对数字进行运算,包括加、减、乘、除、平方根等。
*BigDecimal类是线程安全的。
BigDecimal类是一个非常强大的工具,可以用来进行精确的数学运算。在使用BigDecimal时,需要注意以上几点,以避免出现精度损失或其他问题。