2014-11-07 37 views
1

我收到一個編譯器錯誤:經紀公司的Windows運行時組件 - System.Decimal

「法XXX有一個類型的參數值‘System.Decimal System.Decimal‘是不是一個有效的Windows運行時只能返回’。’ Windows運行時類型「。

有反正我可以使用小數?或者我應該只將值存儲爲一個整數的美分?

+0

看起來像這樣(金融應用程序中的小數與雙數的問題)由同一主題上的其他問題的數量解決:http://stackoverflow.com/search?q=double+versus+decimal。簡短的回答是「不要那樣做」。你最好使用自定義的定點數據類型(它使我忽略了許多他們遺漏的WinRT的東西...... System.Decimal絕對是其中之一) – 2014-11-07 01:15:00

+0

嗯,我總是覺得我應該使用十進制貨幣。我想我有點難以理解,爲什麼我不能爲我的代理運行時組件使用Decimal。 您可以請擴展此自定義的定點數據類型嗎? – 2014-11-07 01:22:18

+0

如果可用,您應該使用Decimal來獲取金錢。它解決了浮點格式中存在的舍入錯誤。您可以研究固定點,因爲網絡上有很多關於它的地方。簡短的說法就是,例如,你可以保留代表便士的整數,甚至是百分之一的便士。然後正常加/減工作,當然你必須跟蹤乘法和除法的小數點位移。 – 2014-11-07 01:39:37

回答

0

我發現最簡單的解決方案是將它存儲爲一個整數美分。

我相信這可能不適用於世界上所有的貨幣,但我只關心美元,所以它不是這個特定情況下的問題。

另一種方法是實現一個「錢」模式 - http://martinfowler.com/eaaCatalog/money.html

0

其實,我發現最簡單的方法是使用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); 

而且它瓦特orks很好!