decimal Java
时间: 2025-05-05 17:59:11 浏览: 20
### Java 中 BigDecimal 的基本用法
#### 什么是 BigDecimal?
`BigDecimal` 是一种不可变的任意精度有符号十进制数,在 Java 中定义于 `java.math` 包下。它提供了高精度计算的能力,适用于金融和其他需要精确数值表示的应用场景[^1]。
#### 创建 BigDecimal 对象
可以通过多种方式创建 `BigDecimal` 实例。以下是常见的几种方法:
```java
import java.math.BigDecimal;
public class BigDecimalExample {
public static void main(String[] args) {
// 使用静态常量
BigDecimal one = BigDecimal.ONE;
// 使用 valueOf 方法
BigDecimal decimalValue = BigDecimal.valueOf(1.5);
// 使用构造函数(不推荐用于浮点数)
BigDecimal constructedDecimal = new BigDecimal("100");
System.out.println(one); // 输出: 1
System.out.println(decimalValue); // 输出: 1.5
System.out.println(constructedDecimal); // 输出: 100
}
}
```
注意:当通过字符串创建 `BigDecimal` 时可以避免因浮点数精度丢失带来的问题[^4]。
#### 基本运算操作
`BigDecimal` 提供了一系列的方法来进行加减乘除等算术运算,并支持指定舍入模式来处理结果的小数位数。
```java
import java.math.BigDecimal;
import java.math.RoundingMode;
public class ArithmeticOperations {
public static void main(String[] args) {
BigDecimal num1 = new BigDecimal("123.45");
BigDecimal num2 = new BigDecimal("10.9876");
// 加法
BigDecimal sum = num1.add(num2);
// 减法
BigDecimal difference = num1.subtract(num2);
// 乘法
BigDecimal product = num1.multiply(num2).setScale(4, RoundingMode.HALF_UP);
// 除法
BigDecimal quotient = num1.divide(num2, 4, RoundingMode.DOWN);
System.out.println("Sum: " + sum.toPlainString()); // Sum: 134.4376
System.out.println("Difference: " + difference.toPlainString()); // Difference: 112.4624
System.out.println("Product: " + product.toPlainString()); // Product: 1356.2148
System.out.println("Quotient: " + quotient.toPlainString()); // Quotient: 11.236
}
}
```
上述代码展示了如何执行四则运算并设置保留的有效数字以及相应的舍入模式。
#### 将对象转换为 JSON 字符串
如果希望将包含 `BigDecimal` 类型字段的对象序列化成 JSON 格式的字符串,则可借助第三方库如 Jackson 来完成此任务。下面是一个简单的例子展示如何利用自定义工具类 `JsonMapper` 完成这一目标[^5]:
```java
import com.fasterxml.jackson.databind.ObjectMapper;
class DataObject {
private BigDecimal amount;
public DataObject(BigDecimal amount) { this.amount = amount;}
public BigDecimal getAmount() {return amount;}
}
public class JsonConversionExample {
public static void main(String[] args) throws Exception{
ObjectMapper mapper = new ObjectMapper();
DataObject obj = new DataObject(new BigDecimal("123.45"));
String jsonString = mapper.writeValueAsString(obj);
System.out.println(jsonString); // {"amount":"123.45"}
}
}
```
这里我们构建了一个含有 `BigDecimal` 属性的数据模型,并将其转化为 JSON 表达形式。
#### 数据存储注意事项
SQLite 并未提供类似于 C# 或者 Java 中的大整数/大实数类型的直接映射,其最接近的是 REAL 类型——唯一可用作浮点数据类型的一种实现[^3]。因此在设计数据库表结构的时候需要注意这一点,可能需要额外考虑精度损失的风险或者采取其他策略保存原始值。
---
阅读全文
相关推荐


















