当前位置: 首页 > backend >正文

PostgreSQL 中的金钱计算处理

PostgreSQL 提供了几种处理货币和金融计算的方式,以下是全面的指南:

1. 货币数据类型

(1) money 类型

  • 专门用于存储货币值

  • 显示时会自动格式化为本地货币格式

  • 示例:

    CREATE TABLE products (id SERIAL PRIMARY KEY,name VARCHAR(100),price MONEY
    );INSERT INTO products (name, price) VALUES ('Laptop', 999.99);

(2) numeric/decimal 类型(推荐)

  • 更精确,适合金融计算

  • 可指定精度:

    price DECIMAL(10, 2)  -- 共10位,2位小数

2. 基本金钱计算

-- 加法
SELECT 10.50::numeric + 5.25::numeric;-- 减法
SELECT 20.00::numeric - 7.50::numeric;-- 乘法
SELECT 15.00::numeric * 3::numeric;-- 除法
SELECT 100.00::numeric / 4::numeric;-- 四舍五入
SELECT ROUND(123.4567::numeric, 2);  -- 123.46-- 截断小数
SELECT TRUNC(123.4567::numeric, 2);  -- 123.45

3. 高级金融计算

(1) 百分比计算

-- 计算折扣价
SELECT original_price * (1 - discount_percent/100) AS discounted_price
FROM products;

(2) 复利计算

-- A = P(1 + r/n)^(nt)
SELECT principal * POWER(1 + (rate/100)/periods, periods*years) AS compound_amount
FROM investments;

(3) 累计总和

SELECT month, revenue, SUM(revenue) OVER (ORDER BY month) AS cumulative_revenue
FROM monthly_sales;

4. 货币格式化

-- 格式化为货币
SELECT TO_CHAR(1234.56, 'L9,999.99');  -- 本地货币符号
-- 示例输出: "$1,234.56" 或 "¥1,234.56" 或 "€1,234.56"-- 指定货币符号
SELECT TO_CHAR(1234.56, 'USD9,999.99');  -- USD1,234.56

5. 汇率转换

-- 创建汇率表
CREATE TABLE exchange_rates (from_currency CHAR(3),to_currency CHAR(3),rate NUMERIC(12,6),effective_date DATE
);-- 货币转换计算
SELECT amount, amount * (SELECT rate FROM exchange_rates WHERE from_currency = 'USD' AND to_currency = 'EUR' AND effective_date <= CURRENT_DATEORDER BY effective_date DESC LIMIT 1) AS converted_amount
FROM transactions;

6. 最佳实践

  1. 避免使用浮点类型float/real 可能导致舍入误差,应使用 numeric/decimal

  2. 保持一致精度:如统一使用2位小数表示分

  3. 考虑使用整数存储分:如存储$10.99为1099,避免小数问题

  4. 事务处理:金融操作应在事务中完成

    BEGIN;
    UPDATE accounts SET balance = balance - 100 WHERE id = 1;
    UPDATE accounts SET balance = balance + 100 WHERE id = 2;
    COMMIT;

7. 常见问题解决方案

(1) 处理舍入误差

-- 银行家舍入法
SELECT ROUND(amount::numeric, 2, '0.5'::numeric) AS rounded_amount;

(2) 精确比较

-- 不要直接比较浮点数
WHERE ABS(price1 - price2) < 0.0001;-- 更好的方式
WHERE price1::numeric(12,2) = price2::numeric(12,2);

(3) 分页显示金额

SELECT amount,amount / 100 AS dollars,amount % 100 AS cents
FROM transactions;

通过合理使用这些技术和数据类型,PostgreSQL 可以非常可靠地处理各种金融计算需求。

http://www.xdnf.cn/news/18229.html

相关文章:

  • SpringBoot 整合 Langchain4j RAG 技术深度使用解析
  • [论文阅读] 人工智能 + 软件工程 | 从用户需求到产品迭代:特征请求研究的全景解析
  • 微美全息(NASDAQ:WIMI):以区块链+云计算混合架构,引领数据交易营销科技新潮流
  • STM32学习笔记16-SPI硬件控制
  • 力扣48:旋转矩阵
  • RAG拓展、变体、增强版(二)
  • redis执行lua脚本的原子性和数据库原子性的区别
  • C++STL-list 底层实现
  • GSPO:Towards scalable reinforcement learning for language models
  • Web 安全之延迟攻击(Delay Attack)详解
  • 从基础到本质:文件 IO 操作全解析
  • 【Linux仓库】进程等待【进程·捌】
  • vc++调试总结
  • E10 通过RPC实现账号批量锁定与解锁
  • 管理项目服务器连接数据库
  • 【语法】markdown非常用场景
  • 交叉编译.so到鸿蒙使用
  • ansible playbook 实战案例roles | 实现基于node_exporter的节点部署
  • AV1视频编码器2024-2025技术进展与行业应用分析
  • scikit-learn/sklearn学习|变量去中心化和标准化
  • 【iOS】NSRunLoop
  • PyCharm2025无法启动Powershell.exe的解决办法
  • Google Chrome 扩展不受信任 - 不受支持的清单版本 解决方案
  • 苹果XR芯片介绍
  • 【GPT入门】第51课 将hf模型转换为GGUF
  • MyBatis--缓存详解
  • ACE - 阿里开源的一站式AI图像生成和编辑模型
  • C++排序算法学习笔记
  • 【数据结构】用堆解决TOPK问题
  • Ansible 配置并行 - 项目管理笔记