Flutter关于币种的显示 2023-02-13 周一
2023-02-27 本文已影响0人
勇往直前888
问题
金钱显示差异一开始,只有一个币种,人民币CNY,没有出现过这种问题。后来,增加美元USD,就出现这种前后端不一致的问题了。第一个界面的13.41是客户端计算的结果。第二界面的13.42是服务计算的结果,通过接口在客户端显示。
原因分析和措施
-
先计算还是先转化?
一开始的做法是先转化币种,然后参与计算。这样毫无疑问会扩大误差。
后来改成统一用人民币CNY计算,最后需要展示的时候再进行币种转化,使情况大为好转。 -
汇率缓存?
由于汇率转化存在于各个地方,所以APP一启动的时候就会调用汇率接口,并且把汇率结果缓存本地。在使用的地方,只要从缓存读数据就可以了。这样做减少了接口调用,提高了访问效率。
当然,这样做的问题就是当汇率改变的时候,使用缓存数据,结果就不准确了。
所以,后来,增加了汇率接口的调用。虽然用的时候仍然去缓存中拿,但是在进入一个页面的时候,一般都会加入汇率接口的调用,更新缓存,让缓存形同虚设。 -
四舍五入?
一般情况下是这样的,可是有的时候后台却可能采用截断,进一,甚至舍五进六等各种方式。
经过几次修改之后,搞得APP端,前端,后台都很尴尬。 -
插件
问题是从APP端提出来的,后来才知道,前端和后台使用了同一个插件,所以没有爆问题出来。
所以,APP端果断放弃数字处理游戏,也使用相同的插件,问题就暂时解决了(已经解决很多次了)。decimal
更好的方式
很显然,在多币种切换的场景之下,简单的一个amount字段来表示金钱就不够用了,扩展为以下4个字段的对象会好很多。币种,符号,数值,汇率等相关信息都全了。
企业微信截图_e0b1e57e-a88f-42c3-8eea-0540af77b3dd.png这种方式要求基本上由服务端来承担计算任务,引入BFF模式将更好落地(轻客户端)。(客户端和服务端都想推脱,宁可在出现差异的时候找插件。屁股决定脑袋,符合人性)