如何在F#中定义货币类型

6

你能否建议一种最佳的方法在F#中定义货币类型?


1
从回答来看,您的问题需要澄清。您是在谈论度量单位(例如为了不混淆两种不同的货币),还是关于小数和舍入问题? - Benjol
5个回答

11

F#的度量标准对金融应用程序没有提供任何额外的好处吗? - Sergej Andrejev
1
可以,但是你仍然可以定义一个decimal<USD>(或者任何你创建的货币度量)。 - H27studio

5

类型 money = int<美元>

还没有尝试过,你能定义任意单位吗,还是只能使用明确定义的单位?

显然,你可能想要:

类型 money = int<货币的千分之一> (或者是一角钱,或其他什么)。

为了更加准确。

编辑:

小数可以有类型,因此您可以将货币定义为:

[<Measure>]

type = pounds

type money = decimal<pounds>

这可以确保货币不会因意外而交叉转换,例如:

如果

balance = decimal<pounds>

并且

payment = decimal<dollars>

newbalance = balance + payment

如果不进行转换,代码将无法编译,你需要将payment转换为decimal<pounds>


我不明白你的建议是什么 :( F#允许定义任意单位。 - Sergej Andrejev
F# 允许您为数字类型定义度量单位。因此,您可以定义一个类型长度 = float<米>,并且单位将通过计算得以保留。 参见:http://blogs.msdn.com/andrewkennedy/archive/tags/Units+of+Measure/default.aspx - Massif
1
但是,令人欣喜的是..你可以将度量单位定义为小数! [<Measure>] type = 美元type money = decimal<美元> - Massif
截至2009年5月CTP版,显然也可以将度量单位应用于整数(尽管这对于货币有什么帮助还不确定)。 - Benjol

2

Luca Bolognese建议基于float类型定义自己的Money类型:

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

我跟随了链接,那只是一个例子,而不是建议。这取决于应用程序,但我相信对于绝大多数应用程序来说,被接受的答案是正确的选择。 - Bent Tranberg

1

F# 现在内置支持度量和单位。 根据此特性的主要工程师 Kennedy,它是针对金融应用等解决方案的。

因此,在 F# 中定义自己的货币类型之前,我建议先看一下这个特性。

Werner


0

使用 long 类型,并在其中存储便士(或十分之一便士)。

你可以使用 Decimal 这样的类,但通常会非常慢


1
在这种情况下,正确性不应该比速度更重要吗? - Erich Mirabal
使用整数类型来存储最小单位不准确,这与使用双精度类型不同。 - gbjbaanb
2
危险。除了高错误率之外,当有人说税率是每单位$0.001时,您以后可能会遇到问题。 - Jonathan Allen
1
我投票支持这个因为对于我的简单财务需求,使用分为单位和int类型非常好用。我认为货币类型需要根据应用程序的要求进行定义。在我的情况下,我可以非常自信地说我永远不会使用十分之一美分。 - Brad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接