鸿蒙多功能工具箱开发实战(十五)-汇率换算与理财计算开发
鸿蒙多功能工具箱开发实战(十五)-汇率换算与理财计算开发前言汇率换算和理财计算是财务工具的重要组成部分。本文将讲解汇率换算、理财收益计算、房贷车贷计算等功能实现。一、汇率换算1.1 汇率数据结构exportinterfaceCurrency{code:string// 货币代码name:string// 货币名称symbol:string// 货币符号rate:number// 对人民币汇率}exportconstCURRENCIES:Currency[][{code:CNY,name:人民币,symbol:¥,rate:1},{code:USD,name:美元,symbol:$,rate:7.2},{code:EUR,name:欧元,symbol:€,rate:7.8},{code:GBP,name:英镑,symbol:£,rate:9.1},{code:JPY,name:日元,symbol:¥,rate:0.048},{code:KRW,name:韩元,symbol:₩,rate:0.0054},{code:HKD,name:港币,symbol:HK$,rate:0.92},{code:TWD,name:新台币,symbol:NT$,rate:0.22}]exportclassExchangeRateConverter{staticconvert(amount:number,fromCurrency:Currency,toCurrency:Currency):number{// 先转换为人民币再转换为目标货币constcnyAmountamount*fromCurrency.ratereturncnyAmount/toCurrency.rate}}二、理财计算2.1 定期存款计算exportclassDepositCalculator{/** * 计算定期存款收益 */staticcalculate(params:{principal:number// 本金rate:number// 年利率%years:number// 存期年compound:boolean// 是否复利}):{interest:number// 利息total:number// 本息合计yearlyInterest:number[]// 每年利息}{constyearlyInterest:number[][]if(params.compound){// 复利计算letcurrentparams.principalfor(leti0;iparams.years;i){constinterestcurrent*params.rate/100yearlyInterest.push(interest)currentinterest}return{interest:current-params.principal,total:current,yearlyInterest}}else{// 单利计算constinterestparams.principal*params.rate/100*params.yearsfor(leti0;iparams.years;i){yearlyInterest.push(params.principal*params.rate/100)}return{interest,total:params.principalinterest,yearlyInterest}}}}2.2 基金定投计算exportclassFundInvestmentCalculator{/** * 计算基金定投收益 */staticcalculate(params:{monthlyAmount:number// 每月投入months:number// 投资月数annualReturn:number// 预期年化收益率%}):{totalInvest:number// 总投入totalValue:number// 最终价值totalReturn:number// 总收益returnRate:number// 收益率}{constmonthlyReturnparams.annualReturn/100/12consttotalInvestparams.monthlyAmount*params.months// 定投终值公式consttotalValueparams.monthlyAmount*((Math.pow(1monthlyReturn,params.months)-1)/monthlyReturn)*(1monthlyReturn)consttotalReturntotalValue-totalInvestconstreturnRatetotalReturn/totalInvest*100return{totalInvest,totalValue:Math.round(totalValue*100)/100,totalReturn:Math.round(totalReturn*100)/100,returnRate:Math.round(returnRate*100)/100}}}三、贷款计算3.1 等额本息计算exportclassLoanCalculator{/** * 等额本息计算 */staticcalculateEqualPayment(params:{principal:number// 贷款本金annualRate:number// 年利率%years:number// 贷款年限}):{monthlyPayment:number// 月供totalPayment:number// 还款总额totalInterest:number// 利息总额schedule:Arrayany// 还款计划}{constmonthlyRateparams.annualRate/100/12constmonthsparams.years*12// 月供公式constmonthlyPaymentparams.principal*monthlyRate*Math.pow(1monthlyRate,months)/(Math.pow(1monthlyRate,months)-1)consttotalPaymentmonthlyPayment*monthsconsttotalInteresttotalPayment-params.principal// 生成还款计划constschedulethis.generateSchedule(params.principal,monthlyRate,months,monthlyPayment)return{monthlyPayment:Math.round(monthlyPayment*100)/100,totalPayment:Math.round(totalPayment*100)/100,totalInterest:Math.round(totalInterest*100)/100,schedule}}/** * 等额本金计算 */staticcalculateEqualPrincipal(params:{principal:numberannualRate:numberyears:number}):{firstPayment:number// 首月还款lastPayment:number// 末月还款totalPayment:numbertotalInterest:numberschedule:Arrayany}{constmonthlyRateparams.annualRate/100/12constmonthsparams.years*12constmonthlyPrincipalparams.principal/months// 首月还款constfirstPaymentmonthlyPrincipalparams.principal*monthlyRate// 末月还款constlastPaymentmonthlyPrincipalmonthlyPrincipal*monthlyRate// 总利息consttotalInterest(params.principalmonthlyPrincipal)*months/2*monthlyRateconsttotalPaymentparams.principaltotalInterestreturn{firstPayment:Math.round(firstPayment*100)/100,lastPayment:Math.round(lastPayment*100)/100,totalPayment:Math.round(totalPayment*100)/100,totalInterest:Math.round(totalInterest*100)/100,schedule:[]}}privatestaticgenerateSchedule(principal:number,monthlyRate:number,months:number,monthlyPayment:number):Arrayany{constschedule[]letremainingprincipalfor(leti1;imonths;i){constinterestremaining*monthlyRateconstprincipalPartmonthlyPayment-interest remaining-principalPart schedule.push({month:i,payment:Math.round(monthlyPayment*100)/100,principal:Math.round(principalPart*100)/100,interest:Math.round(interest*100)/100,remaining:Math.max(0,Math.round(remaining*100)/100)})}returnschedule}}四、界面实现EntryComponentstruct LoanCalculatorPage{Stateprincipal:string1000000Staterate:string4.9Stateyears:string30Stateresult:anynullbuild(){Column(){NavBar({title:房贷计算器})// 输入区域Column(){this.InputRow(贷款金额,this.principal,(v)this.principalv,万元)this.InputRow(年利率,this.rate,(v)this.ratev,%)this.InputRow(贷款年限,this.years,(v)this.yearsv,年)}Button(计算).onClick(()this.calculate())if(this.result){Column(){Text(月供:${this.result.monthlyPayment}元).fontSize(24).fontWeight(FontWeight.Bold)Row(){Text(还款总额:${this.result.totalPayment}元)Text(利息总额:${this.result.totalInterest}元)}}}}}privatecalculate(){this.resultLoanCalculator.calculateEqualPayment({principal:parseFloat(this.principal)*10000,annualRate:parseFloat(this.rate),years:parseInt(this.years)})}}图1 汇率计算界面展示五、高级理财计算5.1 理财计算流程图定期存款基金定投等额本息等额本金输入本金和利率选择计算类型计算复利计算定投收益计算月供计算首月月供返回本息合计返回还款计划5.2 复利计算// 复利计算functioncompoundInterest(principal:number,rate:number,years:number,frequency:number1):number{constnfrequency*yearsconstrrate/frequencyreturnprincipal*Math.pow(1r,n)}5.3 基金定投计算functionfundInvestment(params:{monthlyAmount:numbermonths:numberannualReturn:number}):FundResult{const{monthlyAmount,months,annualReturn}paramsconstmonthlyReturnannualReturn/12consttotalCostmonthlyAmount*monthsconsttotalValuemonthlyAmount*((Math.pow(1monthlyReturn,months)-1)/monthlyReturn)*(1monthlyReturn)return{totalCost,totalValue,profit:totalValue-totalCost}}六、汇率换算优化6.1 汇率缓存classExchangeRateCache{privatestaticrates:Mapstring,numbernewMap()privatestaticlastUpdate:number0staticasyncgetRate(from:string,to:string):Promisenumber{constkey${from}-${to}returnthis.rates.get(key)||1}}七、单元测试describe(LoanCalculator,(){it(should calculate equal payment correctly,(){constresultLoanCalculator.calculateEqualPayment({principal:1000000,annualRate:0.049,years:30})expect(result.monthlyPayment).toBeGreaterThan(0)})})八、小结本文详细讲解了财务计算工具✅ 汇率换算与缓存✅ 定期存款计算✅ 基金定投计算✅ 等额本息贷款✅ 等额本金贷款✅ 复利计算✅ 单元测试覆盖系列文章导航下期预告鸿蒙多功能工具箱开发实战(十六)-实时行情数据获取

相关新闻

Ubuntu虚拟化与KVM管理

Ubuntu虚拟化与KVM管理

Ubuntu虚拟化与KVM管理 一、虚拟化概述 1.1 什么是虚拟化 虚拟化是一种技术,允许在单个物理服务器上运行多个独立的虚拟环境(虚拟机)。每个虚拟机都有自己的操作系统、应用程序和资源分配。 虚拟化的优势: 资源利用率高:充分利用物理服务器资源 隔离性强:虚拟机之间相…

2026/10/17 13:52:04 阅读更多 →
鸿蒙 ArkTS 实战:随身行李称重的限重解析、物品清单、启用状态与剩余重量

鸿蒙 ArkTS 实战:随身行李称重的限重解析、物品清单、启用状态与剩余重量

鸿蒙 ArkTS 实战:随身行李称重的限重解析、物品清单、启用状态与剩余重量 前言 随身行李称重是一个基于 ArkTS 和 ArkUI 声明式 UI 的鸿蒙单页项目,入口文件位于 entry/src/main/ets/pages/Index.ets。 本文围绕 随身行李重量管理 场景,拆解…

2026/10/20 11:46:49 阅读更多 →
Ubuntu开发环境搭建(Python-Go-Rust)

Ubuntu开发环境搭建(Python-Go-Rust)

Ubuntu开发环境搭建(Python/Go/Rust) 一、开发环境概述 1.1 为什么需要搭建开发环境 一个良好的开发环境是高效编程的基础,它应该具备以下特点: 统一的工具链:所有开发人员使用相同版本的工具 快速部署:能够快速搭建和复制开发环境 隔离性:不同项目之间互不干扰 可扩…

2026/10/17 13:52:29 阅读更多 →

最新新闻

大模型推理优化与部署实战:从KV Cache、量化到服务压测

大模型推理优化与部署实战:从KV Cache、量化到服务压测

大语言模型能写诗、能写代码,可是一旦真实跑到线上去服务用户,推理优化与部署才是真正决定系统能不能撑住的那道关卡。很多团队花大力气训好了模型,结果一上线就暴露各种问题:单请求时延太高、并发上来直接OOM、一个长对话把显存吃…

2026/10/21 4:52:56 阅读更多 →
Redis热Key从发现到治理:大厂高并发缓存优化实践

Redis热Key从发现到治理:大厂高并发缓存优化实践

Redis热Key这个事,干后端的人早晚都会碰上。我印象特别深的一次,是某次大促压测,一个商品维度的Key QPS直接冲到了几十万,Redis实例的CPU先扛不住了,整个链路的响应时间从2毫秒一路飙到几百毫秒,紧接着就是…

2026/10/21 4:52:56 阅读更多 →
Yeastar PSTN网关与FreePBX对接实战:SIP中继配置避坑指南

Yeastar PSTN网关与FreePBX对接实战:SIP中继配置避坑指南

1. 从一通打不通的外线电话说起如果你正在看这篇内容,大概率你手里正握着一台Yeastar的PSTN网关,或者正准备把它和FreePBX对接起来。我先说结论:这套组合能跑通,而且跑通之后非常稳定,但中间有几个坑,几乎每…

2026/10/21 4:52:56 阅读更多 →
知识工作插件实战:从采集到温习的全流程效率工具

知识工作插件实战:从采集到温习的全流程效率工具

先聊聊我为什么会对“knowledge-work-plugins”这个东西上瘾。这几年我一直在一线做知识型项目,每天的工作基本就是读资料、写笔记、做分析、出方案,坏消息是中间的衔接环节特别散。今天在文档里看到一句话很关键,明天可能就忘在哪个聊天记录…

2026/10/21 4:52:56 阅读更多 →
为什么1.58比特就够了?揭秘parakeet-redux三值量化的核心原理

为什么1.58比特就够了?揭秘parakeet-redux三值量化的核心原理

人工智能语音模型量化模型压缩 【免费下载链接】parakeet-redux 项目地址: https://ai.gitcode.com/hf_mirrors/moondream/parakeet-redux 点击查看 免费下载 parakeet-redux 是一个 1.58 比特三值量化(ternary quantization)的自动语音识别…

2026/10/21 4:52:56 阅读更多 →
论文数据炼金术:AI辅助从提取到清洗的全流程实战

论文数据炼金术:AI辅助从提取到清洗的全流程实战

写在前面:这篇东西不是软件广告,也不打算把某个工具吹成神话。它就来自我自己平时处理论文数据的一堆真实经历:从抓取文献里的零散数据,到清洗成一张能看能算的表,再到最后写出方法学和图表描述,中间踩过的…

2026/10/21 4:51:55 阅读更多 →

日新闻

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

统一内存+量化:锐龙AI Max PRO 400如何本地跑320B大模型

这段时间硬件圈和AI圈都在传一个事:AMD锐龙AI Max PRO 400系列把最高192GB统一内存搬进了PC形态的产品里,按宣传口径,本地跑320B参数的大家伙不再是纸面概念。我第一反应倒不是“内存真大”,而是这话背后的含金量——它把过去只能…

2026/10/21 0:00:11 阅读更多 →
AI助手深度使用体验:对话质量、长文本处理与指令遵循如何留住用户

AI助手深度使用体验:对话质量、长文本处理与指令遵循如何留住用户

1. 从“封号重开”这个行为说起:用户到底在追求什么“封号重开”这四个字,放在任何产品语境里都带着一股决绝的味道。一个账号从零开始积累使用记录、调教偏好、沉淀工作流,背后是大量的时间和精力成本。正常情况下,没有人愿意主动…

2026/10/21 0:00:11 阅读更多 →
ROS中YOLOv3工程落地:通信同步、坐标变换与性能调优

ROS中YOLOv3工程落地:通信同步、坐标变换与性能调优

1. 为什么在ROS里硬刚YOLOv3不是“炫技”,而是工程落地的必经之路我第一次在某高校机器人实验室看到那台搭载Jetson TX2的移动底盘原地打转、反复识别错垃圾桶时,就意识到:单纯跑通darknet_ros demo和真正让YOLOv3在ROS里“干活”&#xff0c…

2026/10/21 0:00:11 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/20 20:43:59 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/21 4:27:17 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 10:02:08 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:45 阅读更多 →