代码之家  ›  专栏  ›  技术社区  ›  esskar

MATLAB和.NET,系统。双重显示为整数

  •  0
  • esskar  · 技术社区  · 15 年前

    我成功地将.NETDLL集成到MATLAB中。一切都很好。但是,我通过了一个系统。双重使用类似于6000.46的值,并在MATLAB函数中作为[valueFromDotNet]返回 MATLAB的ans是ans=6000,但我希望至少ans=6000.4600

    我确保格式简短。(如果get(0,'Format')),我还将格式设置为long; 什么都没变。任何人都知道为什么会这样。

    发现了问题。我从外部服务接收输入MATLAB的数据。那里的数字被格式化为字符串,但总是“6000.46”;我用CultureInfo.InvariantCulture,但这似乎是错误的。把它改成了新的文化信息(“en-US”),现在可以用了!

    编辑3:

    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 回复  |  直到 15 年前
        1
  •  2
  •   Andrew Janke    15 年前

    可能发生的情况是,返回的其他值中有一个是整数类型,这会导致在连接它们时转换double。与大多数其他编程语言不同,在组合浮点和整数类型时,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.勾号加倍。也许通过提取arg.勾号并在逐步遍历字段时进行转换。

        2
  •  0
  •   High Performance Mark    15 年前

    首先要看的是Matlab控制台中数字的格式——确保数字是6000,而不是6000.46,如果没有小数部分的话。