我成功将.NET Dll集成到MATLAB中。一切都是好的。但是,我传递一个值为6000.46的System.Double,并将其作为[valueFromDotNet]返回给MATLAB函数 MATLAB的ans是ans = 6000,但我预计至少ans = 6000.4600 我有什么想法吗?
编辑1: 我确保格式很短。 (如果得到(0,'格式')),我也设置格式长; 什么也没有变。任何人都知道为什么会这样。
编辑2: 发现了问题。我收到了从外部服务提供给MATLAB的数据。这些数字形成为字符串,但始终为“6000.46”;我用CultureInfo.InvariantCulture解析,但这似乎是错误的。将其更改为新的CultureInfo(“en-US”),现在可以使用了!
编辑3: 我太兴奋了。它仍然是stange。但我认为现在只是不知道数学运算是如何工作的
我有这个回调
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
结果是这个价格包括分数
答案 0 :(得分:2)
可能发生的是返回的其他值之一是整数类型,并且当连接它们时导致双重转换。与大多数其他编程语言不同,当组合浮点和整数类型时,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
>>
如果这是正在发生的事情,你应该明确地将arg.Tick中的所有int值转换为double。也许通过将arg.Tick提取到结构中并在逐步遍历字段时进行转换。
答案 1 :(得分:0)
首先要看的是Matlab控制台中数字的格式 - 确保数字为6000而不是6000.46而不是小数部分。