【问题标题】:Using Math.Round with a Unit of Measure使用带有度量单位的 Math.Round
【发布时间】:2015-10-05 01:14:28
【问题描述】:

我正在尝试在函数中使用Math.Round 来四舍五入金额,如下所示:

let calculateTaxablePayToDate previousPayToDate taxablePayThisMonth =
    taxablePayThisMonth
    |> fun (x:decimal) -> Math.Round(x)
    |> fun x -> x + previousPayToDate 

我传入的类型都是decimal<GBP> 类型。当我尝试通过该函数运行它们时,虽然我得到:

这个表达式应该有类型
decimal,但这里有类型
int<GBP>

如何在附有度量单位的图上使用Math.Round

【问题讨论】:

  • 请添加可以用示例编译的代码 sn-p 你如何调用calculateTaxablePayToDate 函数。否则很难找到
  • 请注意,您可以使用(+) previousPayToDate 代替fun x -> x + previousPayToDate

标签: f# units-of-measurement


【解决方案1】:

Math.Round 需要原始值,而不是度量值。您可以将其包装在度量类型中的泛型函数中:

open System
open Microsoft.FSharp.Core.LanguagePrimitives

let roundMeasure<[<Measure>]'u>(x: decimal<'u>): decimal<'u> = Math.Round(decimal x) |> DecimalWithMeasure

你应该能够做到:

let calculateTaxablePayToDate previousPayToDate taxablePayThisMonth =
        taxablePayThisMonth |> roundMeasure |> fun x -> x + previousPayToDate

let calculateTaxablePayToDate previousPayToDate taxablePayThisMonth =
    previousPayToDate + (roundMeasure taxablePayThisMonth)

【讨论】:

  • 谢谢@Lee。 roundMeasure 管道的最终功能是什么; DecimalWithMeasure?目前没有编译那部分。
  • 没关系,我解决了。必须打开LanguagePrimitives :) 谢谢
  • 主题,但我认为管道在这里并没有真正的帮助。为什么不只是(roundMeasure taxablePayThisMonth) + previous
  • 这也有效。谢谢托马斯。该语法如何工作;使用 roundMeasuretaxablePayThisMonth 周围的括号?
  • @Stu1986C 它将函数roundMeasure 应用于值taxablePayThisMonth;括号确保首先评估函数应用程序,然后将结果传递给加法运算。
猜你喜欢
  • 2015-12-09
  • 1970-01-01
  • 2013-06-27
  • 1970-01-01
  • 2015-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-07
相关资源
最近更新 更多