2014-11-07 1 views
1

Я получаю ошибку компиляции:Brokered среды выполнения Windows Component - System.Decimal

«Метод ххх имеет значение параметра типа„System.Decimal System.Decimal „не является допустимым среды выполнения Windows должен возвращать только“.“ Windows Runtime. "

Есть ли в любом случае я могу использовать десятичный знак? или я должен просто сохранить значение в виде центов в целых числах?

+0

Кажется, что это (вопрос о десятичном и двойном в финансовых приложениях) рассматривается по числу других вопросов по той же теме: http://stackoverflow.com/search?q=double+versus+decimal. Короткий ответ: «Не делай этого». Вам будет лучше использовать пользовательский тип данных с фиксированной точкой (это пугает мой мозг многими из вещей, которые они оставили из WinRT ... System.Decimal определенно является одним из них) –

+0

Ну, у меня всегда было такое впечатление, что я следует использовать Decimal за деньги. Наверное, я немного озадачен тем, почему я не могу использовать Decimal для моего брокерского компонента времени выполнения. Не могли бы вы расширить этот настраиваемый тип данных с фиксированной точкой? –

+0

Вы _should_ используете десятичный за деньги, если он доступен. В нем рассматриваются ошибки округления, которые существуют в форматах с плавающей запятой. Вы можете исследовать фиксированную точку, так как в Интернете есть много информации об этом. Короткий вариант заключается в том, что, например, вы можете хранить целые числа, представляющие гроши или даже сотые доли копейки; то добавление/вычитание работает нормально, и, конечно, вы должны отслеживать движение десятичной дроби для умножения и деления. –

ответ

0

Я нашел, что самым простым решением было сохранить его в виде центов в целых числах.

Я считаю, что это может не работать для всех валют в мире, но меня беспокоят только доллары, поэтому это не проблема в этом конкретном сценарии.

Альтернатива заключается в реализации «деньги» образец - http://martinfowler.com/eaaCatalog/money.html

0

На самом деле, я нашел самый простой способ заключается в использовании double для возвращаемых значений и параметров моего WinRT компонента.

Это то, что у меня есть в моей библиотеке # класса C

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

Это код на C# среды выполнения Windows Portable библиотеки классов я создал в качестве оболочки для вызова из моего кода JavaScript

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

А из моего проекта JavaScript, это то, что я называю

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

И это ж орки просто отлично!

Смежные вопросы