MATLAB и .NET, System.Double отображается как целое число - PullRequest
0 голосов
/ 23 сентября 2010

Я успешно интегрировал мой .NET Dll в MATLAB. Все хорошо. Но я передаю System.Double со значением, например 6000.46, и возвращаю его в функции MATLAB как [valueFromDotNet] ANS MATLAB - ANS = 6000, но я ожидал, что ANS = 6000.4600 У кого-нибудь есть идея, где мне искать?

РЕДАКТИРОВАТЬ 1: Я заверил, что формат короткий. (если get (0, 'Format')) и я также установил формат long; Ничего не изменилось. У кого-нибудь есть идея, почему это происходит?

РЕДАКТИРОВАТЬ 2: нашел проблему. Я получаю данные, которые я передаю в MATLAB, из внешнего сервиса. числа там отформатированы как строки, но всегда как «6000.46»; я разобрался с CultureInfo.InvariantCulture, но это было неправильно. Изменил его на новый CultureInfo ("en-US"), и теперь он работает!

РЕДАКТИРОВАТЬ 3: я был слишком взволнован. это все еще странно. но я думаю, что теперь просто не зная, как работает mathlab

У меня есть этот обратный звонок

function tbmxHandleTickEvent(source,arg)
   t = arg.Tick;
   [t.BidPrice t.AskSize t.AskPrice t.LastSize t.LastPrice]
end

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

когда я изменяю обратный вызов, как это

function tbmxHandleTickEvent(source,arg)
   t = arg.Tick;
   t.BidPrice
end

результат - эта цена, включая дробь

Ответы [ 2 ]

2 голосов
/ 23 сентября 2010

Что может случиться, так это то, что одно из этих возвращаемых значений имеет целочисленный тип, и это приводит к преобразованию двойного числа при его объединении. В отличие от большинства других языков программирования, при объединении типов с плавающей запятой и целочисленных типов Matlab сужает значения с плавающей запятой (двойные) до целочисленных типов вместо расширения целых чисел.

Вот пример в R2009b.

>> x = [6000.46 int32(1)], class(x)
x =
        6000           1
ans =
int32
>> 
>> 6000.46 + int32(1)
ans =
        6001

Вы можете диагностировать это, по крайней мере, для объединения, включив предупреждение для этого преобразования с потерями. Попробуйте сделать это и перезапустить ваш код.

>> warning on MATLAB:intConvertNonIntVal
>> x = [6000.46 int32(1)]
Warning: Conversion rounded non-integer floating point value to nearest int32 value. 
x =
        6000           1
>> 

Если это то, что происходит, вы должны явно преобразовать все значения int в arg.Tick в double. Возможно, извлекая arg.Tick в структуру и конвертируя, пока вы шагаете по полям.

0 голосов
/ 23 сентября 2010

Первое, на что нужно обратить внимание - это форматирование чисел в консоли Matlab - убедитесь, что число равно 6000, а не 6000.46 без дробной части.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...