2009-05-21 2 views
5

Можете ли вы предложить лучший способ определить тип денег в F #?Как вы определяете тип денег в F #

+1

Судя по ответам, ваш вопрос нуждается в уточнении. Вы говорите об единицах измерения (например, не путаете две разные валюты), или о десятичных знаках и проблемах округления? – Benjol

ответ

11

Всегда, всегда используйте System.Decimal для хранения финансовых данных! (Если вы не забочусь о неточности и ошибки округления!) http://msdn.microsoft.com/en-us/library/364x0z75(VS.71).aspx

+0

. Я знаю, что это ссылка на C#, но информация верна и для f # ... – Fraser

+0

Таким образом, меры F # не предоставляют никаких дополнительные преимущества для финансовых приложений? –

+1

Да, но вы все равно можете определить десятичное число (или какую бы валютную меру вы не создали) – H27studio

0

использовать длинный и хранить гроши (или десятые доли копейки) в нем.

Вы можете использовать класс Decimal, но обычно это заканчивается being quite slow.

+0

не должно быть правильнее, чем скорость в этом случае? –

+0

Как использовать целочисленный тип для хранения наименьшей единицы, неточной. Это не похоже на двойной тип. – gbjbaanb

+1

Опасно. Помимо высокой вероятности ошибки, у вас могут возникнуть проблемы, когда кто-то говорит, что ставка налога составляет 0,001 доллара США за единицу. –

4

типа деньги = INT <dollars>?

Даже не попробовал это посмотреть ... можете ли вы определить произвольные единицы или работать только с явно определенными?

Очевидно, что вы, вероятно, хотите

типа деньги = INT <thousandths_of_currency> (или десятков гроши, или любой другой).

Чтобы быть более точным.

отредактирован:

десятичные принимать типы, так что вы можете определить, как деньги:

[<Measure>] 

type = pounds 

type money = decimal<pounds> 

, которые могли бы обеспечить валюты не перекрестно конвертированы случайно, например:

если

balance = decimal<pounds> 

и

payment = decimal<dollars> 

newbalance = balance + payment 

не будет компилировать, и вам придется конвертировать платеж decimal<pounds>

+0

Я не понимаю, что вы предлагаете :(F # позволяет определять произвольные единицы. –

+0

aww ... похоже, что единицы применяются только к поплавкам ! curses. – Massif

+0

F # позволяет вам определить единицы измерения для типа номера. Таким образом, вы можете определить тип length = float , и единицы будут сохранены посредством расчетов. См .: http://blogs.msdn.com/andrewkennedy /archive/tags/Units+of+Measure/default.aspx – Massif

2

Luca Bolognese suggests один определяет свой собственный тип деньги основаны от поплавка:

[<Measure>] type money 
let money (f:float) = f * 1.<money> 
+0

Я пошел по ссылке, и это пример, а не предложение. Это зависит от приложения, но я полагаю, что для подавляющего большинства приложений принятый ответ - путь. –

1

F # теперь имеет встроенную поддержку для Меры и блоки. По словам ведущего инженера по этой функции, Кеннеди нацелен на финансовые приложений среди других решений.

Так что я бы посмотрел на это, прежде чем определять свой собственный тип денег в F #.

Werner

Смежные вопросы