0

SQL Server 2008

我的任务是设计对我们现有系统的修改。在用户界面上,我们需要允许输入来自用户货币类型的货币值。以美元存储转换后的金额。对存储的美元进行计算,并将计算结果以美元存储。以他们配置的货币显示给当前用户。

主要问题总结 如果用户输入一个欧元值(例如),我们会将其转换为美元并将该值存储在数据库 (db) 中,以及与用于计算的转换率相关联的 ID。存储到数据库时,我们必须存储大约 8 位小数,以便在从美元转换回来时准确返回以欧元输入的原始金额,以用于显示目的。另一个用户可以登录配置为以美元显示金额,他们会看到什么?我们可能会在数据库中将数据存储到小数点后 8 位,但是我们是否舍入/下限/上限以降低到美分?如果我们在 UI 和报告中只显示货币的百分比,那么我们将在某些时候出现平衡问题,特别是当显示为美元或转换为原始货币以外的货币时。

详细说明 我在构思要保存值的比例时遇到问题。目前我们只存储到小数点后两位,即使我们使用的是 Money 数据类型。如有必要,我们会将 Money 更改为 Decimal(16,9) 左右。此外,我在考虑如何将数据显示给用户时遇到了问题,因为现在我们只在 UI 和报告中显示到分。

我预见到在将 BACK 从 USD 转换为用户的货币类型后显示预期值的问题。这一切都取决于我们在后端存储的内容,以及我们如何地板/天花板/圆形。

我们会将所有值存储在基础货币中,即美元。对输入的值执行计算,并根据结果创建和存储其他数据。

系统将允许用户设置欧元等,并且金额将以该货币和格式显示在用户界面中。用户将无法输入小于该货币最低面额的值。

回顾:用户以欧元输入金额。系统商店以美元计价。模块以美元价值运行并以美元价值创建其他数据并存储结果。在稍后的时间/日期,用户可以返回系统,提取记录,查看以欧元为单位的原始金额,并查看现在转换为欧元的其他计算金额。我们的报告和用户界面仅显示精确到美分的值。

将计算的美元金额转换为不同的货币,除了四舍五入到该货币的分值外,可能会导致显示的值之间出现平衡问题。

In the example below: 'a' is entered by user, 'b' is a look-up in the system, 'c' - 'd' - 'e' are all calculated and stored in database.

     a EUR * b conversion rate = c USD (value floored)
    c USD * <formula> = d result USD (value floored)
    USD - d result USD = e result USD

Balance formula:
USD = e result USD + d result USD

If a user enters 120.00 EUR, we get:
120.00 EUR * 1.330879 = 159.70548000 USD
159.70548000 USD * 0.89 =  142.1378772000 USD
159.70548000 USD - 142.1378772000 USD = 17.5676028000 USD
Balance:
159.70548000 USD  = 17.5676028000 USD + 142.1378772000 USD 

Showing back as EUR:
a: 159.70548000 USD * (1/1.330879 ) = 120 EUR
d: 142.1378772000 USD * (1/1.330879 ) = 106.8000000000000000 EUR
e: 17.5676028000 USD * (1/1.330879 ) = 13.2000000000000000 EUR
Balance:
120 EUR = 13.2000000000000000 EUR + 106.8000000000000000 EUR

If a user enters 120.00 EUR, and we floor our results, we get:
120.00 EUR * 1.330879 = 159.70 USD (value floored)
159.70 USD * 0.89 =  142.13 USD (value floored)
159.70 USD - 142.13 USD = 17.57 USD
Balance:
159.70 USD  = 17.57 USD + 142.13 USD 

Showing back as EUR:
a: 159.70 USD * (1/1.330879 ) = 119.99588242 EUR
d: 142.13 USD * (1/1.330879 ) = 106.79408120 EUR
e: 17.57 USD * (1/1.330879 ) = 13.20180122 EUR
Balance:
119.99588242 EUR = 13.20180122 EUR + 106.79408120 EUR
If we had floored the currency conversion: 119.99 EUR = 13.20 EUR + 106.79 EUR
Should be showing 120.00 EUR since that was what was originally entered by the user.

Showing back as EUR (and rounding):
a: 159.70 USD * (1/1.330879 ) = 120.00 EUR (Rounded)
d: 142.13 USD * (1/1.330879 ) = 106.79 EUR (Rounded)
e: 17.57 USD * (1/1.330879 ) = 13.20 EUR (Rounded)
Balance:
120.00 EUR <> 13.20 EUR + 106.79 EUR (actually equals 199.99)
Off by 1 cent.
4

1 回答 1

0

我认为这会为我做到:

对于用户可以输入值的 UI 中的每个位置,我需要以下内容: 1. 存储在 DB 中的 ReportedValue 一直到货币类型的分。2. BaseValue,存储到基础货币类型的分。3、CurrencyConversionKey,具有原始币种、币种乘数、目的币种、兑换生效日期的一行的PK。

有了这三个值,我总是可以在 UI 中向用户显示原始输入的金额。或者,如果不同的用户(使用不同的配置货币类型)在 UI 中提取记录,则将原始输入的金额转换为不同的货币类型。我可以像我们目前所做的那样继续进行所有内部计算(这将在 BaseValue 上),这将所有计算保持在美分以内,并自动处理业务逻辑的任何舍入问题。

于 2013-09-26T12:37:02.487 回答