本发明涉及计算机技术领域,具体涉及一种运算处理方法、系统、装置以及计算机可读介质。
背景技术:
在金融领域微小的差错都会带来很大的损失。当发生差错时,工作人员往往需要花费大量的时间定位问题。这是因为,在代码层面,java系统多采用bigdecimal对象处理高精度的四则运算。bigdecimal虽然支持任意精度,任意长度的浮点数运算,但是采用方法代替运算符,其计算过程并不直观,为了使日志变得更加直观,研发人员需要为日志添加描述性语言。这同样给研发人员带来工作量,而且也不能确保每个研发人员都按照设定的规范输出日志。
由此,如何在不增加工作量的情况下,使研发人员能够快速定位计算过程中出现的问题,是现有技术中一项值得解决的问题。
技术实现要素:
有鉴于此,本发明实施例提供一种运算处理方法、系统、装置以及计算机可读介质,以解决研发人员对于计算过程中出现的问题定位不易的问题。
根据本发明实施例的第一方面,提供一种运算处理方法,包括:
接收第一表达式;
将所述第一表达式分成多个计算单元,每个计算单元包括左因子、运算符和右因子;
将所述多个计算单元按照包含的运算符的优先级排序;
按照优先级从高到低的顺序分多次计算所述多个计算单元,且在每次计算之前,替换本次计算的计算单元的左和/或右因子,直到基于最后计算的计算单元得到最终结果值;
输出所述最终结果值。
可选地,还包括:
接收第二表达式;
检测所述第二表达式中的括号;以及
在所述第二表达式包含至少一个括号时,以括号作为分隔符,将所述第二表达式转换为至少两个第一表达式。
可选地,还包括:通过递归计算得到所述第二表达式的最终结果值。
可选地,还包括:为每个计算单元建立数据结构,所述数据结构包括左单元、左因子、运算符、右因子、右单元。
可选地,还包括:采用链表存储多个所述数据结构。
可选地,还包括:每次在计算一个计算单元之前,如果其对应的数据结构的左单元不为空,则采用相邻的左侧的计算单元的结果值替换其对应的数据结构的左因子。
可选地,还包括:每次在计算一个计算单元之前,如果其对应的数据结构的右单元不为空,则采用相邻的右侧的计算单元的结果值替换其对应的数据结构的右因子。
可选地,采用bigdecimal对象计算每个计算单元。
可选地,所述第一表达式为字符串,所述将所述第一表达式分成多个计算单元包括:
将字符串分成由数值和运算符组成的字符串数组;
将所述字符串数组中相邻的数值和运作符组成所述多个计算单元。
可选地,还包括:如果所述第一表达式中包含变量,采用变量值替换所述变量。
根据本发明实施例的第二方面,提供一种运算处理系统,包括:
接收模块,用于接收第一表达式;
第一划分模块,将所述第一表达式分成多个计算单元,每个计算单元包括左因子,运算符和右因子;
排序模块,用于将所述多个计算单元按照包含的运算符的优先级排序;
计算模块,用于按照优先级从高到低的顺序分多次计算计算单元,且在每次计算之前,替换本次计算的计算单元的左和/或右因子,直到基于最后计算的计算单元得到最终结果值;
输出模块,用于输出所述最终结果值。
可选地,还包括:
第二划分模块,用于接收第二表达式,检测所述第二表达式中的括号,在所述第二表达式包含至少一个括号时,以括号作为分隔符,将所述第二表达式转换为至少两个第一表达式。
根据本发明实施例的第三方面,提供一种计算机可读存储介质,所述计算机可读存储介质存储有计算机指令,所述计算机指令被执行时实现上述任一项所述的运算处理方法。
根据本发明实施例的第四方面,提供一种运算处理装置,包括:
存储器,用于存储计算机指令;
处理器,耦合到所述存储器,所述处理器被配置为基于所述存储器存储的计算机指令执行实现上述任一项所述的运算处理方法。
本发明一实施例具有以下优点或有益效果:将表达式存储成计算单元,按照运算符的优先级分多次对计算单元进行计算,使整个计算过程变得非常直观,便于研发人员快速定位问题。
在一些实施例中,该运算处理方法的所有步骤均包含在一个单独的功能模块中,当出现问题时,研发人员可以集中精力排查该功能模块的代码,从而解决了功能模块分散导致问题定位不易的问题。
在一些实施例中,每个计算单元的计算步骤均被记录到到日志中,使得每个计算步骤都清晰可见,有利于研发人员基于日志快速定位问题。
附图说明
通过参照以下附图对本发明实施例的描述,本发明的上述以及其它目的、特征和优点将更为清楚,在附图中:
图1是本发明一实施例的运算处理方法的流程图;
图2a-2c是根据本发明一实施例的分多次对计算单元进行计算的示意图;
图3a-3c是根据本发明一实施例的对包含括号的表达式进行处理的示意图;
图4是根据本发明一实施例的运算处理系统的结构图;
图5是本发明实施例的数据请求管理装置的结构图。
具体实施方式
以下基于实施例对本发明进行描述,但是本发明并不仅仅限于这些实施例。在下文对本发明的细节描述中,详尽描述了一些特定的细节部分。对本领域技术人员来说没有这些细节部分的描述也可以完全理解本发明。为了避免混淆本发明的实质,公知的方法、过程、流程没有详细叙述。另外附图不一定是按比例绘制的。
图1是本发明一实施例的运算处理方法的流程图。该运算处理方法接收表达式,输出表达式的结果值。优选地,该运算处理方法的所有步骤均包含在一个单独的功能模块中,实现数值运算的集中处理,从而有助于问题定位和排查。在一些实施例中,执行该运算处理方法的计算引擎部署在一个独立的服务器或服务器集群上,部署在其他服务器或服务器集群上的应用程序向计算引擎发送表达式,并接收结果值。工作人员检查结果值,如果发现结果值和预期不符,则检查计算引擎的各个计算步骤,确定问题所在。
参考图1,所述运算处理方法具体包括以下步骤。
在步骤s100中,接收表达式。
在本实施例中,所述表达式限定为仅包含数值和运算符。
在步骤s101中,将表达式转换成多个计算单元。
所述计算单元是在内存中创建的存储单元,每个计算单元包含左因子、运算符和右因子。左因子和右因子均为数值。运算符例如加、减、乘、除。例如,表达式2*5-2/3转换为三个计算单元分别为:2*5,5-2,2/3。
在一些实施例中,表达式为字符串,先将字符串按照数值和运算符分隔,组成字符串数组,如2*5-2/3变成字符串数组为:2,*,5,-,2,4,然后根据字符串数组制作上述三个计算单元,制作方法是:定位每个运算符的位置,将一个运算符相邻的左右两边元素和运算符组合在一起得到计算单元。
在步骤s102中,对计算单元按照运算符的优先级排序。
在本步骤中,从计算单元对应的存储单元中取出运算符,根据运算符的优先级排序计算单元。例如,上述的三个计算单元排序的结果为2*5,2/3,5-2,2*5和2/3优先级相同,所以两者的排序不分先后。
在步骤s103中,按照优先级顺序获取计算单元。
在步骤s104中,计算获取到的计算单元。
在步骤s105中,采用当前计算单元的结果值替换下一个计算单元相应位置的左或右因子。
在步骤s106中,所有计算单元均已完成。如果未完成,则执行s103,否则执行步骤s107。
步骤s103至s106是一个循环过程,在这个循环过程中,按照计算单元包含的运算符的优先级顺序对计算单元进行计算,并采用已经计算过的计算单元的结果值替换下一个计算单元的左因子或右因子。
在步骤s107中,输出结果值。
在本发明实施例中,按照运算符的优先级分多次对计算单元进行计算,从而使得整个计算过程变得非常直观。
对于步骤s103至步骤s107,下面以表达式2*5-2/3得到的三个计算单元2*5,5-2,2/3为例进行更详细的描述。图2a-2c是根据本发明一实施例的分多次对计算单元进行计算的示意图。
在图2a-2c中,201、202、203是为三个计算单元建立一个数据结构,该数据结构用于描述计算单元自身的属性以及和其他计算单元的相邻关系。该数据结构设计为包括id、左单元、左因子、运算符、右因子、右单元。
参看图2a,结构201描述计算单元2*5,其id为1,左单元为空,即其左侧没有相邻的计算单元,左因子为2,运算符为*,右因子为5,右单元为:id为2的单元,即右侧的相邻的计算单元为:5-2。
结构202描述计算单元5-2,其id为2,左单元为:id为1的单元即2*5,左因子为5,运算符为-,右因子为2,右单元为:id为3的单元,即2/3。
结构203描述计算单元2/3,其id为3,左单元为:id为2的单元即5-2,左因子为2,运算符为/,右因子为3,右单元为空。
参见图2b,根据运算符的优先级,首先对计算单元1进行计算,得到结果值为10,则用10替换计算单元2的左因子,并且将计算单元1的数据结构从队列中删除。
参见图3b,根据计算符的优先级,再次对计算单元3进行计算,得到结果值为0.67,则用0.67替换计算单元2的右因子,最终输出计算单元3的结果值即(10-0.67)的值
在本示例中,根据每个计算单元生成数据结构,并且将数据结果放在队列中,根据优先级分多次完成每个计算单元的计算,在完成一个计算单元计算之后,将其对应的数据结构删除,并采用该结果值替换相邻计算单元的左因子或右因子。
在一个实施例中,将上述结中的“左单元”和“右单元”的数据项设置成指针,该指针用于指向相邻的左单元和右单元,如果没有响应的左单元或右单元,则指针为空。由此将对表达式的计算转换为链表的处理。最终通过程序代码处理链表,得到表达式的结果值。
应该指出,在上述的实施例中,将表达式中包含括号的情况排除在外。这是因为对包含括号的表达式的计算可以被处理成对多个不包含括号的表达式的计算。
例如,表达式2*(3 2)/3可以处理成表达式(3 2)和表达式(2*5/3),即优先将括号中的数值运算出来,并使用结果值替换原括号内的表达式。如果对于嵌套括号,则可以采用递归计算的方式分多次计算括号中的表达式的结果值,直到得到最终数值。
图3a-3c是根据本发明一实施例的对包含括号的表达式进行处理的示意图。本实施例以表达式(4 3)*10为例示出了如何将包含括号的表达式转换为不包含括号的表达式。
如图3a所示,首先将表达式对应的数值和运算符推送到主栈300中,然后建立队列310,将从主栈300中读取到的括号内的数值和运算符放在队列310中,如图3b所示,并针对队列310进行计算得到结果值7,将结果值7放回到主栈300中,如图3c所示,最终针对主栈中的数值和运算符得到最终数值。如果表达式中包含嵌套括号,先找到表达式最里面的左括号以及对应的右括号,并从中取出数值和运算符放在队列中进行计算,然后将最里面的括号替换为结果值。以此类推。
还应该指出,为了保证计算精度,对于每个计算单元的计算,优选采用bigdecimal方法进行。而且,为了方便工作人员后续检查每个步骤,将每个计算单元的计算过程记录到日志中。更优选的是,该运算处理方法在接收到表达式时,记录一条日志,然后在每个计算单元的计算过程中,记录多条日志,最后在输出最终结果值时,记录一条日志。
应该指出,接收到的表达式可能不仅包括数值,运算符,括号,还会包括变量,如果包括变量,则应在计算前,将变量替换为变量值。当然,更好的方式是在将表达式传递给计算引擎之前,替换表达式中的所有变量。
图4是根据本发明一实施例的运算处理系统的结构图。所述运算处理系统400包括接收模块401、第一划分模块402、排序模块404、计算模块404和输出模块405。
接收模块401用于接收第一表达式。
第一划分模块402将第一表达式分成多个计算单元,每个计算单元包括左因子,运算符和右因子。
排序模块404用于将多个计算单元按照包含的运算符的优先级排序。
计算模块404用于按照优先级从高到低的顺序分多次计算计算单元,且在每次计算之前,替换本次计算中的左和/或右因子,直到基于最后计算的计算单元得到最终结果值。
输出模块405用于输出最终结果值。
在一个实施例中,运算处理系统400还包括:第二划分模块,用于接收第二表达式,检测所述第二表达式中的括号,在所述第二表达式包含至少一个括号时,以括号作为分隔符,将所述第二表达式转换为至少两个第一表达式。
本发明实施例提供的运算处理系统按照运算符的优先级分多次对计算单元进行计算,从而使得整个计算过程变得非常直观。该运算处理系统的所有步骤可以均包含在一个单独的功能模块中,由此,当出现问题时,研发人员可以集中精力排查该功能模块的代码,从而解决了功能模块分散导致问题排查不易的问题。
图5是根据本发明实施例的数据请求管理装置的结构图。图5示出的设备仅仅是一个示例,不应对本发明实施例的功能和使用范围构成任何限制。
参考图5,该装置包括通过总线连接的处理器501、存储器502和输入输出设备503。存储器502包括只读存储器(rom)和随机访问存储器(ram),存储器502内存储有执行系统功能所需的各种计算机指令和数据,处理器501从存储器502中读取各种计算机指令以执行各种适当的动作和处理。输入输出设备包括键盘、鼠标等的输入部分;包括诸如阴极射线管(crt)、液晶显示器(lcd)等以及扬声器等的输出部分;包括硬盘等的存储部分;以及包括诸如lan卡、调制解调器等的网络接口卡的通信部分。存储器502还存储有以下的计算机指令以完成本发明实施例的装置规定的操作:采用计算引擎进行数值运算,所述计算引擎包括:接收第一表达式;将所述第一表达式分成多个计算单元,每个计算单元包括左因子,运算符和右因子;将所述多个计算单元按照包含的运算符的优先级排序;按照优先级从高到低的顺序分多次计算所述多个计算单元,且在每次计算之前,替换本次计算的计算单元左和/或右因子,直到基于最后计算的计算单元得到最终结果值;输出最终结果值。
相应地,本发明实施例提供一种计算机可读存储介质,该计算机可读存储介质存储有计算机指令,所述计算机指令被执行时实现上述方法所规定的操作。
附图中的流程图、框图图示了本发明实施例的系统、方法、装置的可能的体系框架、功能和操作,流程图和框图上的方框可以代表一个模块、程序段或仅仅是一段代码,所述模块、程序段和代码都是用来实现规定逻辑功能的可执行指令。也应当注意,所述实现规定逻辑功能的可执行指令可以重新组合,从而生成新的模块和程序段。因此附图的方框以及方框顺序只是用来更好的图示实施例的过程和步骤,而不应以此作为对发明本身的限制。
系统的各个模块或单元可以通过硬件、固件或软件实现。软件例如包括采用java、c/c /c#、sql等各种编程语言形成的编码程序。虽然在方法以及方法图例中给出本发明实施例的步骤以及步骤的顺序,但是所述步骤实现规定的逻辑功能的可执行指令可以重新组合,从而生成新的步骤。所述步骤的顺序也不应该仅仅局限于所述方法以及方法图例中的步骤顺序,可以根据功能的需要随时进行调整。例如将其特征在于的某些步骤并行或按照相反顺序执行。
根据本发明的系统和方法可以部署在单个或多个服务器上。例如,可以将不同的模块分别部署在不同的服务器上,形成专用服务器。或者,可以在多个服务器上分布式部署相同的功能模块、模块或系统,以减轻负载压力。所述服务器包括但不限于在同一个局域网以及通过internet连接的多个pc机、pc服务器、刀片机、超级计算机等。
以上所述仅为本发明的优选实施例,并不用于限制本发明,对于本领域技术人员而言,本发明可以有各种改动和变化。凡在本发明的精神和原理之内所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。
1.一种运算处理方法,其特征在于,包括:
接收第一表达式;
将所述第一表达式分成多个计算单元,每个计算单元包括左因子、运算符和右因子;
将所述多个计算单元按照包含的运算符的优先级排序;
按照优先级从高到低的顺序分多次计算所述多个计算单元,且在每次计算之前,替换本次计算的计算单元的左和/或右因子,直到基于最后计算的计算单元得到最终结果值;
输出所述最终结果值。
2.根据权利要求1所述的运算处理方法,其特征在于,还包括:
接收第二表达式;
检测所述第二表达式中的括号;以及
在所述第二表达式包含至少一个括号时,以括号作为分隔符,将所述第二表达式转换为至少两个第一表达式。
3.根据权利要求2所述的运算处理方法,其特征在于,还包括:通过递归计算得到所述第二表达式的最终结果值。
4.根据权利要求1所述的运算处理方法,其特征在于,还包括:为每个计算单元建立数据结构,所述数据结构包括左单元、左因子、运算符、右因子、右单元。
5.根据权利要求4所述的处理方法,其特征在于,还包括:采用链表存储多个所述数据结构。
6.根据权利要求4所述的运算处理方法,其特征在于,还包括:每次在计算一个计算单元之前,如果其对应的数据结构的左单元不为空,则采用相邻的左侧的计算单元的结果值替换其对应的数据结构的左因子。
7.根据权利要求4所述的运算处理方法,其特征在于,还包括:每次在计算一个计算单元之前,如果其对应的数据结构的右单元不为空,则采用相邻的右侧的计算单元的结果值替换其对应的数据结构的右因子。
8.根据权利要求1所述的运算处理方法,其特征在于,采用bigdecimal对象计算每个计算单元。
9.根据权利要求1所述的运算处理方法,其特征在于,所述第一表达式为字符串,所述将所述第一表达式分成多个计算单元包括:
将字符串分成由数值和运算符组成的字符串数组;
将所述字符串数组中相邻的数值和运作符组成所述多个计算单元。
10.根据权利要求1所述的运算处理方法,其特征在于,还包括:如果所述第一表达式中包含变量,采用变量值替换所述变量。
11.一种运算处理系统,其特征在于,包括:
接收模块,用于接收第一表达式;
第一划分模块,将所述第一表达式分成多个计算单元,每个计算单元包括左因子,运算符和右因子;
排序模块,用于将所述多个计算单元按照包含的运算符的优先级排序;
计算模块,用于按照优先级从高到低的顺序分多次计算计算单元,且在每次计算之前,替换本次计算的计算单元的左和/或右因子,直到基于最后计算的计算单元得到最终结果值;
输出模块,用于输出所述最终结果值。
12.根据权利要求11所述的运算处理系统,其特征在于,还包括:
第二划分模块,用于接收第二表达式,检测所述第二表达式中的括号,在所述第二表达式包含至少一个括号时,以括号作为分隔符,将所述第二表达式转换为至少两个第一表达式。
13.一种计算机可读存储介质,其特征在于,所述计算机可读存储介质存储有计算机指令,所述计算机指令被执行时实现如权利要求1至10任一项所述的运算处理方法。
14.一种运算处理装置,其特征在于,包括:
存储器,用于存储计算机指令;
处理器,耦合到所述存储器,所述处理器被配置为基于所述存储器存储的计算机指令执行实现如权利要求1至10中任一项所述的运算处理方法。
技术总结