2009-05-21 9 views
5

Czy możesz zaproponować najlepszy sposób zdefiniowania rodzaju pieniędzy w F #?Jak definiujesz rodzaj pieniędzy w F #

+1

Sądząc po odpowiedziach, twoje pytanie wymaga wyjaśnienia. Czy mówisz o jednostkach miary (na przykład nie mylących dwóch różnych walut) lub o ułamkach dziesiętnych i problemach z zaokrąglaniem? – Benjol

Odpowiedz

11

Zawsze, zawsze, używaj System.Decimal do przechowywania danych finansowych! (chyba, że ​​nie dbają o nieścisłości i błędów zaokrągleń!) http://msdn.microsoft.com/en-us/library/364x0z75(VS.71).aspx

+0

Wiem, że jest to odwołanie do C#, ale informacja jest również zgodna z f # ... – Fraser

+0

Tak więc F # środki nie zapewniają żadnych dodatkowe korzyści dla aplikacji finansowych? –

+1

Tak, ale nadal można zdefiniować liczbę dziesiętną (lub dowolną miarę waluty, którą tworzysz) – H27studio

0

użyj długiego i przechowuj w nim grosze (lub dziesiąte centa).

Można użyć klasy takiej jak dziesiętna, ale zwykle kończy się ona being quite slow.

+0

Czy w tym przypadku poprawność nie powinna być ważniejsza od prędkości? –

+0

jak używać typu integer do przechowywania najmniejszej jednostki nie jest dokładna. To nie jest jak używanie podwójnego typu. – gbjbaanb

+1

Niebezpieczny. Poza dużą szansą na błąd, możesz później mieć problemy, gdy ktoś mówi, że stawka podatku wynosi 0,001 USD za sztukę. –

4

typ pieniądze = int <dollars>?

Nawet nie próbowałem go zobaczyć ... czy można zdefiniować dowolne jednostki, czy też działa tylko z wyraźnie zdefiniowanymi?

Oczywiście, że prawdopodobnie chcesz

typu pieniądze = int <thousandths_of_currency> (lub kilkadziesiąt groszy, czy cokolwiek).

Aby być bardziej dokładnym.

edycja:

dziesiętne wziąć typów, dzięki czemu można określić jako pieniądze:

[<Measure>] 

type = pounds 

type money = decimal<pounds> 

które mogłyby zapewnić waluty nie są przekrojami przekształcone przez przypadek, na przykład:

jeśli

balance = decimal<pounds> 

i

payment = decimal<dollars> 

newbalance = balance + payment 

nie zostanie skompilowany, a będziesz musiał konwertować zapłatę decimal<pounds>

+0

Nie otrzymuję Twojej sugestii :(F # pozwala na zdefiniowanie dowolnych jednostek –

+0

aww ... wygląda na to, że jednostki dotyczą tylko elementów pływających ! curses: – Massif

+0

F # pozwala na zdefiniowanie jednostek miary dla typu liczbowego, więc możesz zdefiniować typ length = float , a jednostki zostaną zachowane poprzez obliczenia Zobacz: http://blogs.msdn.com/andrewkennedy /archive/tags/Units+of+Measure/default.aspx – Massif

2

Luca Bolognese suggests jeden definiuje swój własny rodzaj pieniędzy opiera się pływaka:

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

Podążyłem za łączem i to jest przykład, a nie sugestia. Zależy to od aplikacji, ale uważam, że w przypadku większości aplikacji akceptowaną odpowiedzią jest droga. –

1

F # teraz ma wbudowane wsparcie dla Miary i jednostki. Według głównego inżyniera tej funkcji, Kennedy ma na celu między innymi aplikacje finansowe.

Spojrzałbym na to przed zdefiniowaniem własnego rodzaju pieniędzy w F #.

Werner