找到最近的好号码

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的价格,格式规则将需要更新.我正在寻找一种不需要任何手动维护/检查的解决方案.

Nik*_* B. 4

对于给定的十进制值 X,您希望找到最小的整数 Y,使得 YA + B 尽可能接近 X,对于某些给定的 A 和 BEg(以美元为例),您有 A = .5 和 B = .49 。

\n\n

一般来说,对于您的问题,A 和 B 可以通过以下公式计算:

\n\n
V = 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\n
Run Code Online (Sandbox Code Playgroud)\n\n

请注意,如果没有额外条件,由于 0.09 美元小于 0.10 英镑,因此 16.86 美元的结果为 14.9。

\n\n

经过一些变换我们得到

\n\n
Y ~ (X - B) / A\n
Run Code Online (Sandbox Code Playgroud)\n\n

因为 Y 是整数,所以我们有

\n\n
Y = round((X - B) / A) \n
Run Code Online (Sandbox Code Playgroud)\n\n

结果是 YA + B。

\n