Tom*_*len 5 algorithm formatting currency rounding
鉴于GBP £商店中接受的基础货币和其他货币表:
Currency Symbol Subunits LastToGBPRate
------------------------------------------------------
US Dollars $ 100 0.592662000
Euros € 100 0.810237000
Japanese Yen ¥ 1 0.005834610
Bitcoin ? 100000000 301.200000000
Run Code Online (Sandbox Code Playgroud)
我们有一个有一定量的转换工作方法GBP Pence (AKA cents)进入Currency X cents.鉴于999(£9.99)的价格,对于上述货币,它将返回:
Currency Symbol
---------------------
US Dollars 1686
Euros 1233
Japanese Yen 1755
Bitcoin 3482570
Run Code Online (Sandbox Code Playgroud)
这一切都很好.然后我们有一个Format Currency方法将它们全部转换为漂亮的数字:
Currency Formatted
---------------------
US Dollars $16.86
Euros €12.33
Japanese Yen ¥1755
Bitcoin ?0.03482570
Run Code Online (Sandbox Code Playgroud)
现在我们要解决的问题是,meaningful pretty number在给定上述信息的情况下,将这些数量舍入到通用算法中最接近的数量.
这有两个重要的好处:
A meaningful number是显示的最小单位不小于£0.10的值,a pretty number是以49或结尾的a 99.示例输出:
Currency Formatted Meaninful and Pretty
-----------------------------------------------------
US Dollars $16.86 $16.99
Euros €12.33 €12.49
Japanese Yen ¥1755 ¥1749
Bitcoin ?0.03482570 ?0.0349
Run Code Online (Sandbox Code Playgroud)
我知道可以使用一个算法来完成所有信息,但是我很难解决从哪里开始的问题.任何人都可以告诉我如何实现这一目标,还是指点一下?
请注意,为每种货币存储一般格式规则是不够的,因为假设比特币10x的价格,格式规则将需要更新.我正在寻找一种不需要任何手动维护/检查的解决方案.
对于给定的十进制值 X,您希望找到最小的整数 Y,使得 YA + B 尽可能接近 X,对于某些给定的 A 和 BEg(以美元为例),您有 A = .5 和 B = .49 。
\n\n一般来说,对于您的问题,A 和 B 可以通过以下公式计算:
\n\nV = value of \xc2\xa30.10 in target currency\nK = smallest power of ten (10^k) such that 9*10^k >= V\n and k <= -2 (this condition I added based on your examples, but contrary\n to your definition)\n = 10^min(-2, ceil(log10(V / 9))) \nA = 50 * K\nB = 49 * K\nRun Code Online (Sandbox Code Playgroud)\n\n请注意,如果没有额外条件,由于 0.09 美元小于 0.10 英镑,因此 16.86 美元的结果为 14.9。
\n\n经过一些变换我们得到
\n\nY ~ (X - B) / A\nRun Code Online (Sandbox Code Playgroud)\n\n因为 Y 是整数,所以我们有
\n\nY = round((X - B) / A) \nRun Code Online (Sandbox Code Playgroud)\n\n结果是 YA + B。
\n