【问题标题】:Brokered Windows Runtime Component - System.Decimal代理的 Windows 运行时组件 - System.Decimal
【发布时间】:2015-01-03 17:02:42
【问题描述】:

我收到一个编译器错误:

“方法 xxx 具有“System.Decimal”类型的参数值。“System.Decimal”不是有效的 Windows 运行时必须仅返回 Windows 运行时类型。”

无论如何我可以使用小数吗?还是我应该将值存储为整数中的美分?

【问题讨论】:

  • 似乎这个(金融应用程序中的十进制与双精度问题)由同一主题的其他问题数量解决:stackoverflow.com/search?q=double+versus+decimal。简短的回答是“不要那样做”。最好使用自定义的定点数据类型(这让我很惊讶他们在 WinRT 中遗漏的许多东西......System.Decimal 绝对是其中之一)
  • 嗯,我一直认为我应该使用 Decimal 来赚钱。我想我对为什么不能将 Decimal 用于代理运行时组件感到有些困惑。你能扩展一下这个自定义的定点数据类型吗?
  • 如果可用,您应该使用 Decimal 来赚钱。它解决了浮点格式中存在的舍入错误。您可以研究定点,因为网上有很多关于它的内容。简短的版本是,例如,您可以保留表示便士甚至百分之一便士的整数;然后加/减就可以正常工作了,当然你必须跟踪小数的移动才能进行乘法和除法。
  • WinRT 中存在小数。
  • 不是在构建 Windows 运行时组件时 - msdn.microsoft.com/en-us/library/windows/apps/… 我想我只是将它存储为整数中的美分。

标签: c# .net windows-runtime decimal enterprise


【解决方案1】:

我发现最简单的解决方案是将其存储为整数中的美分。

我相信这可能不适用于世界上的所有货币,但我只关心美元,因此在这种特定情况下它不是问题。

另一种方法是实现“金钱”模式 - http://martinfowler.com/eaaCatalog/money.html

【讨论】:

    【解决方案2】:

    实际上,我发现最简单的方法是使用double 作为我的 WinRT 组件的返回值和参数。

    这就是我的 C# 类库中的内容

    public static double Round(double value, int digits)
    {
        // do stuff
    }
    

    这是我创建的 C# Windows 运行时可移植类库的代码,它是我的 JavaScript 代码调用的包装器

    public static double Round(double val, int digits)
    {
        return MyCSharpClassLib.Class.Round(val, digits);
    }
    

    在我的 JavaScript 项目中,这就是我所说的

    var round = WindowsRuntimeWrapper.Class1.round(3.1415926549, 3);
    

    而且效果很好!

    【讨论】:

      猜你喜欢
      • 2012-08-27
      • 2023-03-08
      • 2017-12-11
      • 1970-01-01
      • 2013-01-22
      • 1970-01-01
      • 2015-12-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多